我正在使用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
但我想知道这是否是最好的方法。所以,我有以下问题:
请考虑我不想更改目录结构或模块名称。
答案 0 :(得分:0)
如果您要更改当前工作目录而不是sys路径,则此方法有效:
from os import chdir
chdir('/')
import config
如果你在root中有其他资源,这可能会更好。这个和上面的解决方案都比你当前的解决方案更简约和pythonic。