[英]can you import your own package in Python?
我正在嘗試了解Python中的import-logic。
如果您以本教程作為參考,那么我認為您將無法執行以下操作:
from sound.effects import echo
至少不是從包裝內。
但是,Suds(我感興趣的軟件包) 在這里做了類似的事情
suds / suds / builder.py的一個片段:
from logging import getLogger
from suds import *
from suds.sudsobject import Factory
..
文件夾結構:
suds/
...no_package_init_file_here...
suds/
__init__.py
builder.py
sudsobject.py
...
如何運作,為什么運作?
我認為在包中使用容器的包名稱是“不允許的”。 根據經驗。
現在,我能想到的一件事是:肥皂水會將自己添加到PYTHONPATH中,從而使每個級別都可以訪問它。 那是原因嗎?
而且,你們認為Suds在這里有一個明智的解決方案嗎? 還是有點hacky?
提前致謝。
兩種解決方案均受支持。 從一個包中可以使用:
from mypackage import mymodule
要么
import mymodule
如果您只想從模塊中導入單個類
from mypackage import mymodule.myclass
要么
import mymodule.myclass
聽起來像pythonpath ..
經過研究,我發現這一切都取決於PYTHONPATH或sys.path
。 因此,當在sys.path
找到sound
時, from sound.effects import echo
在sound
包(第一個示例)中執行from sound.effects import echo
。 僅當sound
位於sys.path
中存在的目錄中時,才會發生這種情況。
相對於執行的腳本
從可以找到聲音包的目錄中調用執行的腳本(.py文件或解釋器)時,不會引發錯誤。 這是因為該目錄是sys.path
列表中的第一個元素。 但是,當執行的腳本位於包本身內時,它將找不到sound
,因此會發生ImportError: No module named sound
引發ImportError: No module named sound
。 除非當然,否則sound
會包含在sys.path
另一個級別(例如/usr/lib/python2.6/dist-packages
)。
關於泡沫
現在,對於suds
此導入語句是正確的。 那是因為suds
包存在於PYTHONPATH( sys.path
)中。 這樣, from suds.sudsobject import Factory
在PYTHONPATH(dist-packages)中調用from suds.sudsobject import Factory
的版本。
額外 :
就我而言,我想修改suds
源代碼,因此我將整個目錄的副本放在我的lib中: my_package/lib/suds/
。 但是,調用腳本(.py)找不到suds
因為它太深了1級。 然后出現導入錯誤,因為無法正確加載肥皂水
如果你不希望suds
從/ dist-packages
,你可以把它添加到sys.path
手動:
import sys, os
suds_parent = os.path.join(os.path.dirname(__file__), 'lib')
if suds_parent not in sys.path:
sys.path.append(suds_parent)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.