gpt4 book ai didi

python - 如何从更深目录中的文件导入模块?

转载 作者:行者123 更新时间:2023-12-04 10:11:26 24 4
gpt4 key购买 nike

假设我的项目结构如下:

project
├── important.py
└── files
└── file1.py

并且文件important.py 包含类Important。
如何从 file1 导入类(重要),而 file1 是正在执行的 python 文件? .

我找到的唯一解决方案是添加此代码,但我想知道是否有更清洁的方法:
import sys; sys.path.append("..")
from important import Important

我尝试过但没有成功的事情:
from project.important import Important
# ModuleNotFoundError: No module named 'project'
# But it does work inside PyCharm (Why is that?)
from ..important import Important
# ValueError: attempted relative import beyond top-level package

即使我添加了 __init__.py,此错误仍会继续显示项目目录中的文件。

要说的是我正在寻找适合任何机器的解决方案,因为我想在 github 上向公众分享这个项目。

最佳答案

您需要在 sys.path 中引用父文件夹.这可以在代码中显式完成,就像您所做的那样,这并不是真正的 unpythonic。它也可以从代码外部完成,例如通过修改系统变量PYTHONPATH或者通过在 python 中安装你的模块。

正如其他回复所建议的那样,我强烈建议不要使用绝对路径,因为那样的话,代码只能在您的机器上运行。这对于学生项目是可以容忍的,但在现实生活中的开发中这是不好的做法,因为需要多人一起工作,它会在测试/生产/沙箱服务器等上执行......

所以方法是正确的。但是,我仍然建议稍微修改您的语法,因为在某些情况下它不会按预期工作:

all_projects/
└── current_project/
├── important.py
└── files
└── file1.py

$ cd /path/to/all_projects/current_project/files/
$ python file1.py
#### > Ok, thanks to the line sys.path.append("..")

$ cd /path/to/all_projects/current_project/
$ python files/file1.py
#### > Ok, because python implicitly add the execution path to sys.path

$ cd /path/to/all_projects/
$ python current_project/files/file1.py
#### > ModuleNotFoundError: No module named 'important'

相反,请使用以下内容:
import sys, os
sys.path.append(os.path.dirname(sys.path[0]))

或者如果 file1.py甚至可以从另一个文件导入,以下更安全:
import sys, os
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

最后,为了良好的开发实践,我还建议将这些行放入一个不同的文件中,例如 _set_path .原因是你可以在以后的文件中重用这个,如果你想修改代码架构,你只需要改变一个文件:
        ├── file1.py
├── file2.py
├── ...
└── _set_path.py

然后,从 file1.py , 您可以使用:
import _set_path
from important import Important

(答案来自 Python: Best way to add to sys.path relative to the current running script )

关于python - 如何从更深目录中的文件导入模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61322726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com