我有一些脚本在不同的目录中使用共享代码(恰好是一个子目录)。
由于各种原因,我不想将共享代码打包到Python包中,也不想将所有文件转储到单个目录中,也不想将子目录添加到路径中。
有没有办法做相对导入&拉入Python 3子目录中的文件?
在IPython3中
import subdir.my_shared_library
工作正常。
然而,这在Python3中失败,以及我为添加__init__.py
文件所做的每一次尝试,并明确地执行相对导入,如import .subdir.my_shared_library
。
有没有办法解决这个问题?
答案 0 :(得分:3)
您只需要向__init__.py
添加\subdir
,然后通过from subdir import my_shared_library
导入。如果您不想将其编译到包含其余代码的软件包中,您也可以使用PATH
或典型导出到sys.path.append('subdir')
将其附加到PYTHONPATH
。如果您不想触摸路径,可以将其放在全局site-packages
中,或者通过类似pyvenv
的内容创建虚拟环境,并将您的库放在包文件夹中那里。
答案 1 :(得分:1)
尝试从shell中追加PYTHONPATH,如
export PYTHONPATH=$PYTHONPATH:subdir; python your_program.py
https://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH
但更好的方法是附加到sys.path:
sys.path.append('subdir')
答案 2 :(得分:0)
是。使用绝对导入:
import subdir.my_shared_library
它假设subdir
的父位于sys.path
中,因为当您从同一目录(父目录)运行Python脚本时就是这种情况。 / p>
即使子目录中没有__init__.py
文件,它也能正常工作。在这种情况下,subdir
将被视为implicit namespace package。虽然你不应该滥用这个功能。
如果您不希望subdir
成为Python包,即,如果您想将my_shared_library
视为顶级模块,则将subdir
本身添加到python路径(假设命令的bash语法和空原始PYTHONPATH
envvar):
$ PYTHONPATH=subdir python -m your_module
其中your_module.py
使用import my_shared_library
。或者(更糟糕的是)直接向您的模块添加sys.path.insert(1, 'subdir')
。