2013-08-16 42 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 * 

它更清楚這樣

相關問題