在Python 3中,是否可以从子目录导入文件?

时间:2015-07-16 20:17:30

标签: python python-3.x python-import

我有一些脚本在不同的目录中使用共享代码(恰好是一个子目录)。

由于各种原因,我不想将共享代码打包到Python包中,也不想将所有文件转储到单个目录中,也不想将子目录添加到路径中。

有没有办法做相对导入&拉入Python 3子目录中的文件?

在IPython3中

import subdir.my_shared_library

工作正常。

然而,这在Python3中失败,以及我为添加__init__.py文件所做的每一次尝试,并明确地执行相对导入,如import .subdir.my_shared_library

有没有办法解决这个问题?

3 个答案:

答案 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')