簡體   English   中英

從多個並行子目錄導入模塊(Python)

[英]Importing Modules from Multiple Parallel Subdirectories (Python)

對於python來說相對較新,我正在使用它進行工作中的實驗室設備自動化。

我的腳本位於目錄B中。目錄B的父目錄為目錄A。目錄A包含另一個目錄,我需要從該目錄輸入和導入模塊。 結構如下:

            A
  B                   C
  myscript.py    
                   E        F
                  m1.py    m2.py

我需要將m1.py和m2.py導入到腳本中。 我無法將我的腳本移到A目錄中,因為它正在訪問我在B中編寫並轉儲的其他模塊。出於公司特定的原因,我需要維護包括C目錄和C目錄以下的所有內容的目錄結構(不要獲取我開始了。)

我的問題是,我該如何智能地導入這些文件? 我不想對它們的路徑進行硬編碼,因為它們將存在於SVN中,並且根目錄可能會更改。 我在考慮使用循環掃描嗎? 我只是不熟悉使之成為可能的語法。 歡迎所有解決方案!

我有以下文件設置:

    A
    ├── B
    │   ├── __init__.py
    │   └── myscript.py
    └── C
        ├── E
        │   ├── __init__.py
        │   └── m1.py
        ├── F
        │   ├── __init__.py
        │   └── m2.py
        └── __init__.py

碼:

A / C / E / m1.py

def my_func1():
    print 'func1'

A / C / F / m2.py

def my_func2():
    print 'func2'

A / B / myscript.py

from C.E.m1 import my_func1
from C.F.m2 import my_func2

my_func1()
my_func2()

或者,如果您的導入目錄名稱帶有空格(例如, C dir而不是C ):

import importlib
m1 = importlib.import_module("C dir.E.m1")
m2 = importlib.import_module("C dir.F.m2")

m1.my_func1()
m2.my_func2()

所有__init__.py文件均為空,但需要存在,因此Python知道在這些文件夾中查找代碼。

cdA目錄,然后以包形式運行腳本。 注意:沒有.py和文件名的末尾。

$ python -m B.myscript

輸出:

func1
func2

如果目錄結構始終相同,則可以嘗試將m1.pym2.py導入,方法是將C的路徑附加到myscript.py sys.path中。

您還可以使用os.path.dirnameos.path.joinos.path.abspath類的os.path方法以及變量__file__B相對地獲取C的路徑。

范例-

import os.path
import sys
curdir = os.path.dirname(__file__)
cdir = os.path.abspath(os.path.join(curdir,'../C'))
sys.path.append(cdir)
import m1,m2

更好的做法是在Python中顯式導入並注意目錄結構。 如果結構發生變化,則您的進口也將發生變化。

只要您的項目位於python路徑上,您就應該能夠從位於B或層次結構中其他任何位置的模塊執行此操作:

from Project.A.B import myscript
from Project.A.C.E import m1
from Project.A.C.F import m2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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