这可能是一个简单的问题,但我无法回答。当我试图更改配置文件的文件夹时会发生这种情况...... 这是我的程序结构:
/{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()或一些丑陋的方法来包围它。 我想问一下是否有一种优雅的方法来解决这个问题?或者我做错了什么?
答案 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)