[英]In Python 3, is it possible to import a file from a subdirectory?
我有一些脚本在其他目录(恰好是子目录)中使用了共享代码。
由于各种原因,我不想将共享代码打包到Python包中,也不想将所有文件转储到一个目录中,也不想将子目录添加到路径中。
有什么办法可以相对导入并提取Python 3子目录中的文件?
在IPython3中
import subdir.my_shared_library
工作正常。
但是,在Python3中,以及我尝试添加__init__.py
文件并显式执行相对导入(如import .subdir.my_shared_library
,此操作均失败。
有办法解决这个问题吗?
您只需要在\\subdir
添加一个__init__.py
,然后from subdir import my_shared_library
。 如果您不想将其与其余代码一起编译成一个包,则还可以使用sys.path.append('subdir')
或典型的导出到PYTHONPATH
将其附加到PATH
。 如果您不想接触路径,则可以将其放入全局site-packages
,或者通过pyvenv
东西创建虚拟环境,并将库放在其中的package文件夹中。
尝试从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')
是。 使用绝对导入:
import subdir.my_shared_library
它假定subdir
的父目录位于sys.path
就像从同一目录(父目录)运行Python脚本时一样。
即使子目录中没有__init__.py
文件,它也将起作用。 在这种情况下, subdir
将被视为隐式名称空间包 。 虽然您不应该滥用此功能。
如果您不希望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')
直接添加到模块中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.