如何从根目录导入一个模块,在后代包中使用另一个具有相同名称的模块?

时间:2016-01-28 18:27:37

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

我正在使用python 2.7.10。

我知道有很多与此相关的问题。我正在开始这个问题,因为我在StackOverflow中找到的答案都没有回答我的怀疑。我的目标是在社区的帮助下澄清我对Python导入机制的理解。

我有一个像这样结构的项目:

./
./config.py
./modules
./modules/__init__.py
./modules/config.py

config.py

VALUE = 1

模块/ config.py

import config
print(config.VALUE)

在这个模块中,我想从根目录中的模块获取VALUE常量并打印它。当我在模块包中运行config时,我收到以下错误:

$ python modules/config.py
Traceback (most recent call last):
  File "modules/config.py", line 1, in <module>
    import config
  File "/test/modules/config.py", line 2, in <module>
    print(config.VALUE)
AttributeError: 'module' object has no attribute 'VALUE'

据我所知, import config 语句导入当前目录中的模块,而不是root目录中的模块。所以我需要添加一个类型的hack 来允许它导入根目录中的模块:

模块/ config.py

def import_from_root(name):
    import os
    import imp
    root_path = os.path.dirname(os.path.abspath(__name__))
    root_module = os.path.join(root_path, '{}.py'.format(name))
    return imp.load_source('root_'.format(name), root_module)

print(import_from_root('config').VALUE)

现在可行:

$ python modules/config.py
1

但我想知道这是否是最好的方法。所以,我有以下问题:

  1. 有更多的pythonic方式来解决这个问题吗?
  2. 迁移到Python 3.x会改善这个吗?
  3. 请考虑我不想更改目录结构或模块名称。

1 个答案:

答案 0 :(得分:0)

如果您要更改当前工作目录而不是sys路径,则此方法有效:

from os import chdir
chdir('/')
import config
如果你在root中有其他资源,这可能会更好。这个和上面的解决方案都比你当前的解决方案更简约和pythonic。