0

我無法從使用setuptools本地編寫和安裝的軟件包中導入模塊。我似乎最終得到一個空的包,除非我明確地導入__init__.py中的模塊,即使如此,它只會將包含cd'的東西導入到包的源目錄中。安裝了python軟件包,內部源代碼目錄除外

這裏是我封裝結構

foo_project/ 
|-- setup.py 
|-- foo/ 
|-- |-- __init__.py 
|-- |-- moduleA.py 
|-- |-- moduleB.py 
|-- |-- ... 

我使用virtualenvwrapper,並要安裝在某些環境ENV上面的包,並打算能夠導入模塊中的一些其他目錄foo_examples

首先,我的__init__.py是空的。要安裝,我:

  • 運行workon ENV激活虛擬環境
  • cdfoo_project
  • 運行python setup.py install

包似乎已成功安裝;我甚至可以檢查~/.virtualenvs/ENV/lib/python3.4/site-packages中的蛋,它似乎有所有正確的文件。

但是,當我嘗試導入模塊,它顯示爲空:

>>> import foo 
>>> dir(foo) 
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] 
>>> foo.moduleA 
AttributeError: 'module' object has no attribute 'moduleA' 

但是,如果我明確地導入在__init__.py我的模塊,它們成爲可訪問:

__init__.py

from . import moduleA, moduleB, ... 

然後:

from foo import moduleA 

不會拋出錯誤,但只有當我還在包源目錄中。如果我升一級,我會遇到同樣的問題。

$ cd .. 
$ python 
>>> import foo 
>>> dir(foo) 
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] 
>>> foo.moduleA 
AttributeError: 'module' object has no attribute 'moduleA' 

我試過尋找相關的問題,但沒有運氣。我懷疑這可能是一個小小的錯誤,或者我完全用錯誤的方式去做。我會很感激一些幫助。謝謝。

回答

0

我想我有一個想法!

因爲你已經寫了一個模塊,你可以導入它。這很清楚。但python無法將模塊中的腳本解釋爲屬性。你正在做的是通過調用它像這樣:

foo.moduleA 

此外moduleA 的.py不是一個屬性,它是一個程序。 如果您在模塊A .py中編寫屬性代碼,則您的代碼可以工作!

像這樣可以在項目中獲得一些代碼作爲屬性代碼!

我希望我能幫助你!

h_e_u_r_e_k_a

編輯:

這是moduleA.py代碼(例如,這就是答案代碼:)

 def myfunctioninA(): 
     print('Spam') 
     print('test') 

如果你導入像你的其他文件這樣的:

 foo.myfunctioninA() 

它將打印Spamtest

該模塊應該有一個不同於包的名稱。

+1

恐怕你的回答不清楚。你可以通過「在moduleA.py中寫入屬性代碼」給出一些具體的例子嗎? –