我有以下目录结构,我是python的新手。在文件夹bin中我有一个单独的文件“script.py”,我想从代码包中导入“module.py”。我已经在stackoverflow上看到了很多解决这个问题的方法,包括修改sys-path或给出完整的路径名。有没有办法可以使用相对有效的import语句导入这些,而不是指定完整路径?
project/
bin/
script.py
code/
module.py
__init__.py
答案 0 :(得分:4)
要确保在不配置环境的情况下运行bin/script.py
,请在script.py
行之前将此前缀添加到from code import module
(
来自twisted/bin/_preambule.py
):
# insert `code/__init__.py` parent directory into `sys.path`
import sys, os
path = os.path.abspath(sys.argv[0]) # path to bin/script.py
while os.path.dirname(path) != path: # until top-most directory
if os.path.exists(os.path.join(path, 'code', '__init__.py')):
sys.path.insert(0, path)
break
path = os.path.dirname(path)
while
循环支持从bin/some-other-directory/.../script.py
答案 1 :(得分:1)
虽然正确,但我认为“将当前目录动态添加到路径”是一个肮脏,肮脏的黑客。
向__init__.py
添加(可能为空白)project
。然后将包含.pth
路径的project
文件添加到sites-packages
目录。然后:
from project.code import module
在我看来,这有两个好处:
1)如果你重构,你只需要改变from project.code
行,避免弄乱别的东西。
2)您的代码没有什么特别之处 - 它的行为与您通过PyPi安装的任何其他软件包完全相同。
将项目目录添加到PYTHONPATH可能看起来很麻烦,但我认为它比任何替代方案都要清晰得多。就个人而言,我已经将我的所有python代码所在的父目录添加到我的PYTHONPATH中,并带有.pth
文件,因此我可以处理我编写的所有代码,就像第三方库一样。
我认为将PYTHONPATH混乱存在任何问题,因为只有__init__.py
的文件夹才可导入。