簡體   English   中英

絕對導入模塊在同一個包中

[英]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.

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