繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM