2017-01-15 217 views
3

我有一個需要能夠運行外部腳本的python項目。重新導入具有相同名稱的不同python模塊

這些腳本被動態地導入到一個包含多個模塊的目錄結構中。

現在,由於這些腳本是獨立編寫的並且彼此不知道,所以它們通常使用相同的模塊名稱。

這對我來說是一個接一個地導入它們的問題。

例如,這裏是我的目錄結構:

  • main.py
    • 一個
      • a.py
      • utils.py
    • b
      • b.py
      • utils.py

所以我在根文件夾中main.py腳本,並在A和B文件夾2 「外部」 的腳本。

這兩個腳本都使用不同的utils.py模塊。一個/ a.py的

內容:一個/ utils.py的

import utils 
utils.hello() 

內容:B/b.py的

def hello(): 
    print 'hello from a' 

內容:

import utils 
utils.hello() 

內容b/utils.py:

def hello(): 
    print 'hello from b' 

main.py的內容現在

import sys 
sys.path.append('a') 
import a 
sys.path.append('b') 
import b 

,這個例子打印:

hello from a 
hello from a 

而我顯然需要打印:

hello from a 
hello from b 

正如我不是在 - 收取「外部」腳本,我無法修改它們,有什麼辦法可以實現這一目標嗎?

編輯

使用@進口喜歡的moinuddin-QUADRI答案:從導入確實適用於這個簡單的例子,但對於這一點:

  • main.py
    • a
      • a.py
      • LIB
        • utils.py
      • LIB2
        • utils2.py
    • b
      • b.py
      • LIB
        • utils.py
      • LIB2
        • utils2.py

如果每個utils.py做:

從LIB2進口utils2

對於這個工作,我需要的根文件夾腳本是在sys.path中

當B/lib中/ utils的嘗試運行:從LIB2進口utils2,它接收utils2在/ LIB2

回答

2

您應該使用相對進口a.pyb.py。所以,你的進口應該是這樣的:

from . import utils 

這意味着從當前目錄,進口utils的。這樣,你問你的Python程序導入A/utils.pyA/a.pyB/utils.py在B/b.py

在具有main.py的目錄(假設__init__.py是alread存在於ab)首先創建一個__init__.py,然後導入a和b在主。PY爲:

from a import a # No need to do `sys.path.append('a')` 
from b import b 

# For importing utils.py (if needed) 
from a import utils as a_utils 
a_utils.hello() 

from b import utils as b_utils 
b_utils.hello() 

還可以閱讀:

+0

謝謝!這個工程雖然我不知道爲什麼... –

+0

@GuyErlich添加了一些鏈接。你可能會發現那些有用的 –

+0

好吧,我發現了一個更復雜的解釋,但仍然無效。請參閱新的編輯 –

0

通常情況下,導入模塊,我們並不需要使用sys.path中:

main.py

from a import a 
# first 'a' is the directory. second 'a' is a.py 
# the 'a' directory needs to have __init__.py which can be blank 
from b import b 

一個/ a.py

from . import utils 

B/b.py

from . import utils 

由於無法修改外部模塊,則可以重命名模塊在導入它們時使用相同的名稱:

main.py

from a import utils as utils_a 
from b import utils as utils_b 

utils_a.hello() 
utils_b.hello() 
+0

謝謝,但正如我所說的,我不能修改a.py和b.py的內容,也不能導入utils。 a.py和b.py執行導入。 –

相關問題