[英]Absolute import module in same package
我將導入問題簡化為這個簡單的基本情況。 說我有一個Python包:
mypkg/
__init__.py
a.py
b.py
a.py包含:
def echo(msg):
return msg
b.py包含:
from mypkg import a # possibility 1, doesn't work
#import a # possibility 2, works
#from mypkg.a import echo # import also fails
print(a.echo())
運行python b.py
會產生ImportError: No module named mypkg
在Python 2.7.6和Python 3.3.5上都ImportError: No module named mypkg
。 我也嘗試在兩種情況下from __future__ import absolute_import
添加,同樣的問題。
我希望可能性1工作得很好。
可能性2不太理想。 假設,標准庫可以引入一個名為a
的包(在這種情況下不太可能,但你明白了)。 雖然Python 2首先搜索當前包 ,但Python 3+包含絕對導入更改,因此首先檢查標准庫。 不管我的理由是什么,可能性1應該起作用,不是嗎? 我可以發誓,我以前做過幾千次。
注意:如果您在mypkg
外部編寫腳本, from mypkg import a
正常工作。
我的問題類似於python - 在同一目錄中對模塊進行絕對導入 ,但作者暗示我所擁有的應該是正常的。
from mypkg import a
是正確的表單。 不要從Python包目錄中運行腳本,它使用可能導致錯誤的多個名稱使相同的模塊可用。 從包含mypkg
的目錄運行python -m mypkg.b
。
為了能夠從任何目錄運行, mypkg
應該在pythonpath中。
嘗試這個:
import sys
import os
this_dir = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.dirname(this_dir))
from mypkg import a
print(a.echo())
我認為問題來自於mypkg文件夾中沒有對mypkg的引用。 看一下當我嘗試運行你的例子時Python正在做什么(使用verbose選項):
# trying /vagrant/mypkg/mypkg.py
這就是為什么它可以找到模塊,因為它不存在。 你可以做的一件事是用一行名為mypkg.py的文件
import a
但這只是你在另一件夾克上面的第二種可能性。 在不知道您想要完成什么的情況下,我會選擇Intra-package Reference文本中的第一個示例。 我會這樣寫b.py :
from a import echo
print(echo('message'))
是的,它不起作用,因為在你調用print(mypkg.a.echo())
, mypkg
仍在加載( mypkg.__init__
- > mypkg.b
)。 這是因為Python首先加載父模塊。 https://docs.python.org/3/reference/import.html#searching
你可以做的是將print(mypkg.a.echo())
包裝到一個函數中:
def echo():
mypkg.a.echo()
接着:
import mypkg.b
mypkg.b.echo()
甚至:
print(sys.modules['mypkg.a'].echo())
您也可以幫助Python找到您的模塊:
import importlib
mypkg.a = importlib.import_module('mypkg.a')
mypkg.a.echo()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.