2013-08-16 43 views
14

我有一个包含good.py模块的hello1包。是否可以从同一包中的模块访问__init__.py中的变量?

hello1 
├── __init__.py 
└── good.py 

初始化模块具有可变A = 1,我需要访问good.py.变量hello1.A

import hello1 

class Good(object): 
    def __init__(self): 
     print hello1.A 

if __name__ == "__main__": 
    g = Good() 

问题是,当我执行python脚本时,我得到了ImportError: 'No module named hello1'错误。我可以在good.py的第一行添加import sys; sys.path.append("..")以进行快速修复。

但是,good.py位于hello1包中,__init__.py也在其中,所以我想知道是否有方法从同一包中的模块访问__init__.py中的变量。

+1

您是否尝试过去到包含'hello1'的目录并使用'python hello1 \ good.py'运行脚本?另外,你可能会在这里找到答案:http://stackoverflow.com/questions/436497/python-import-the-containing-package – flornquake

回答

6

Python: import the containing package

导入__init__似乎很好地工作。

import __init__ 

class Good(object): 
    def __init__(self): 
     print hello1.A 
+5

你不应该直接导入'__init__'。相反,'hello1'的父目录应该在python模块搜索路径中列出,而'hello1'应该被导入。 –

+0

如果您使用'python -m hello1.good',那么当前工作目录会自动添加到路径中;如果这是'hello1'的父目录,那么一切正常。 –

+0

@MartijnPieters,并不总是。如果您的程序包位于程序包内,并且说可执行程序想要查找位于__init__.py中的程序包的版本号,则这正是您应该做的。 – Cerin

0

如果你不喜欢sys.path.append(...),你可以在包含“hello1” -directory目录运行脚本

python -m hello1.good 

或使用PYTHONPATH环境变量,而不是的sys.path。

1

如果我没有记错,你想要做的事,如:

python hello1/good.py 

由于good.py是一个包,你不该的一个子模块,'T直接运行;请记住,直接执行它时,它不会被视为hello1程序包的一部分,该程序包可防止相对导入,并且当前目录是包含该文件的程序包,因此如果它不是部分内容,则无法找到hello1PYTHONPATH

-m mod:相反,你可以使用-m开关Python解释器的运行运行库模块作为一个脚本(终止选项列表)

我个人不喜欢使用翻译选项执行一个python文件。我宁愿有一个独立的启动文件good.py,它导入hello1.good模块,并使用它来做它必须做的事情。

0

您必须显式导入您要使用的常量。

最好将所有常量放在“config”文件(即config.py)中),然后如果你想让它们在包名称空间中导入它们。

初始化 .py文件:

from package.config import * 

它更清楚这样

相关问题