用一个python文件去调用另一个python文件,关于相对路径的处理?

比如用a.py调用执行b.py,但是a.py和b.py路径环境不一样,而b.py中有使用相对路径读取文件,这时会报错,怎么在a.py中进行配置,使其调用b.py时路径和其相同,能否做到?

比如目录结构是这样:

clipboard.png
a.py文件内容是:

def read_file():
    with open('./for_read.txt', 'r') as fp:
        fp.read()

    return

read_file()

b.py文件内容是:

import os

os.system('python ./inner/a.py')

此时执行b文件会报错:

FileNotFoundError: [Errno 2] No such file or directory: './for_read.txt'
阅读 7.9k
5 个回答

其实最好的方法是,在项目根目录做一个全局参数配置的文件,所有需要生成路径的地方,都可以通过这个文件生成,在构建路径时,只需要更改相对路径即可
config.py #位置:项目根目录

import os
root_path = os.path.dirname(__file__)

a.py

import os
from config import root_path
for_read = os.path.join(root_path, 'inner\\for_read.txt')
def read_file():
    with open(for_read, 'r') as fp:
        fp.read()

    return

read_file()

b.py

import os
from config import root_path

a_path = os.path.join(root_path, 'inner\\a.py')
os.system('python {}'.format(a_path))

我有两个a.py和b.py
分别在/home/wsl/github/something_for_work/home/wsl/gopath/src
a.py内容如下

import sys
sys.path.append('/home/wsl/gopath/src')
import b

if __name__ == '__main__':
    b.hello()

b.py内容如下

def hello():
    print("in b.hello; say:hello world")

调用 python a.py 输出如下

in b.hello; say:hello world

上面回答的很对,使用sys.path.append('/.../test'),将你的test文件夹添加到python查找文件的环境,就可以使用python inner/a.py的方式执行a文件,当然你也可以在b文件中通过from import导入a文件的方式去执行。

首先你这么设计肯定缺乏合理性。

其次方案要分情况而言,
如果你的程序运行目录可以修改的话,那么你可以使用 os 的 chdir 函数来修改程序的 cwd。也就是修改到 b.py 那一层文件中去。

当然,你是从 a.py 那一层文件开始执行的,所以你在导入 b.py 文件的时候会出错。使用前面两位回答的修改 sys.path 就可以将 b.py 所在目录添加到包查找路径中。
一般来说,这种添加方法就是比如 <path>/<to>/the_dir/b.py,那么添加到 sys.path 的路径就是 <path>/<to>/the_dir. 这样的话,在 a.py 中就可以使用 import b 的方式导入。同时这不会影响到 b.py 作为包文件使用相对导入的方法。

综上,你需要了解 sys.path, 和程序运行时的 current work directory 的概念,那么你就有了解决这个问题的所有工具。

相对路径是按照你执行程序的位置来定义的,不是该文件的路径位置相对。比如你在a文件夹下执行b文件的程序,此时相对路径的起点是a文件夹不是b!!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题