导入模块中的subFolder的cwd

时间:2017-06-01 12:45:12

标签: python-3.x

这可能是一个简单的问题,但我无法回答。当我试图更改配置文件的文件夹时会发生这种情况...... 这是我的程序结构:

/{PROJECT_DIR_NAME}/main.py
                   /folder1/function_A.py
                   /folder1/json/configfile.json
                   /folder1/__init__.py
在funtion_A.py中

def something:
    os.getcwd()
    with open("json/configfile.json") as f:
    ...
在main.py中

import folder1.function_A
os.getcwd()
def xx():
    fuction_A.something()
    ...

如果我直接运行funtion_A,将找到json文件,因为os.getcwd()返回“/ {PROJECT_DIR_NAME} / folder1 /”。

但是如果我运行main.py,os.getcwd()将返回“/ {PROJECT_DIR_NAME} /”,它将被传递给function_A。结果是:“不是这样的文件或目录:'/ {PROJECT_DIR_NAME} / json / configfile.json'”

我预计模块中的“ init .py”可以自动检索路径。但它不...... 我知道我可以用chdir()或一些丑陋的方法来包围它。 我想问一下是否有一种优雅的方法来解决这个问题?或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

由于json文件是相对于您的模块的,因此您应该使用模块目录来引用它:

with open("json/configfile.json") as f:

变为:

with open(os.path.join(os.path.dirname(__file__),"json/configfile.json")) as f:

所以你的模块适用于当前目录。

现在,如果您无法更改function_A的代码,则可以更改调用方中的目录,执行导入并更改目录。它不是非常“pythonic”,但在你的情况下,这将是有效的:

import folder1
# now we know where folder1 is located
oldp = os.getcwd()
os.chdir(folder1.__file__)  # it's a folder all right
import folder1.function_A   # "json/configfile.json" is valid now
# restore previous path
os.chdir(oldp)