簡體   English   中英

可以用Python導入自己的包嗎?

[英]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 echosound包(第一個示例)中執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM