repository maintainable
,我们有子文件夹来收集特定用途的脚本,并在每个子文件夹中设置lib-folder
以保留共享功能。结构看起来像这样。
root
├── lib
│ ├── hello.py
└── sub
├── hello_user.py
└── lib
__init__.py files exist, but are filtered for better readability
hello_user.py中的代码是:
from lib.hello import hello
hello()
并在hello.py中:
def hello():
print("Hello")
root folder
。 PYTHONPATH to "root/.."
和importing "root.lib"
可行但可能不是一个可行的选项(需要使用脚本和所有现有脚本更改所有设置)。import statement
的解决方案。相对路径没问题,但是如何将relative path
命名为父文件夹? “..”。 lib.hello 不起作用。答案 0 :(得分:1)
如果使用python sub/hello_user.py
执行脚本,则目录sub
会自动添加到sys.path
作为第一个元素。因此root/sub/lib
会在root/lib
之前找到,因此无论PYTHONPATH
点在哪里,都会隐藏它。改变这种情况的唯一方法是确保root
出现在路径root/sub
之前:
sys.path.insert(0, '.../root')
如果您导入模块(或使用python -m sub.hello_user
直接执行模块),则情况会有所不同。
在python2中,导入被隐式视为相对,因此它将尝试导入root/sub/lib/hello.py
,root/lib
再次被root/sub/lib
遮蔽。
Python3通过默认导入绝对来修复此问题,因此它将导入root/lib/hello.py
。您可以通过添加from __future__ import absolute_import
:
# root/sub/hello_user.py:
from __future__ import absolute_import
from lib import hello # imports root/lib/hello.py
from sub.lib import hello # imports root/sub/lib/hello.py
from .lib import hello # same, but relative import instead of absolute
但是,如果sub
早于root
之前的路径,则此功能仍然有效。
答案 1 :(得分:0)
您应该尝试将roor / lib文件夹插入sys.path:
import sys
sys.path.insert(1, 'complete/path/root/lib')
sys.path是一个“字符串列表,用于指定模块的搜索路径。从环境变量PYTHONPATH初始化,加上依赖于安装的默认值”(来自http://docs.python.org/2/library/sys.html?highlight=sys.path#sys.path)。
两条评论:建议保持sys.path [0]不变(因此为1),因为第一个(0)是当前文件夹的预期行为。其次,有sys.path.append,它将为sys.path的 end 添加所需的路径(不是你想要的)。
还有可能有用的imp lib ray(http://docs.python.org/2/library/imp)。
希望它有所帮助, P