python导入的相同子文件夹名称

时间:2013-07-31 07:28:58

标签: python python-import

  • 我正在为日常工作制作一系列 python脚本
  • 为避免重复,我们希望使用导入来共享一些工具。
  • 要保留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")
  • PYTHONPATH 设置为root folder
  • 当我尝试执行“python sub / hello_user.py”时,出现错误“ImportError:No module called hello”。如果我将sub / lib重命名为sub / lib_hide,我得到预期的输出“Hello”。
  • 如何从 root / lib 而不是 root / sub / lib 导入python?
  • 设置PYTHONPATH to "root/.."importing "root.lib"可行但可能不是一个可行的选项(需要使用脚本和所有现有脚本更改所有设置)。
  • 我更喜欢我只修改import statement的解决方案。相对路径没问题,但是如何将relative path命名为父文件夹? “..”。 lib.hello 不起作用。

2 个答案:

答案 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.pyroot/lib再次被root/sub/lib遮蔽。

Python3通过默认导入绝对来修复此问题,因此它将导入root/lib/hello.py。您可以通过添加from __future__ import absolute_import

在python2中获得此行为
# 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