2015-05-27 55 views
0

我有一個小問題,導入一個腳本,在父文件夾,但我設法解決它使用:使用蟒蛇與複式父相對進口和孩子夾

import sys 
sys.path.append("../") 

我的目錄是這樣的:

Data 
|->->code 
    |->->script1.py 
    |->->->->subfolder 
       |->->->script2.py 

當我從子文件夾目錄運行script2(它導入script1)時,腳本運行時沒有問題。但是,如果我嘗試使用運行從代碼目錄SCRIPT2:

:~ ./subfolder/script2.py 

我得到一個錯誤:

ImportError: No module named script1 

我試圖用相對進口,而是因爲我的代碼是不是在包裝結構它不工作。有沒有一種方法可以從兩個目錄(父目錄和子目錄)運行script2,並且每次都能夠導入script1?

謝謝你在前進, 格奧爾基尼科洛夫

編輯:好吧,以後我經歷了所有的建議讀,我做了一個「簡單」的黑客這在我看來是相當難看,但工作得很好:

import sys 
parent_folder = sys.path[0].split("/subfolder")[0] 
sys.path.append(parent_folder) 
import script1 

現在,我甚至可以從根調用SCRIPT2與它要管理導入SCRIPT1

+0

python版本? 2.7和3.x具有不同的導入默認行爲(這使我很困惑)。但一般來說,如果你想重新使用代碼,最好把它做成一個包。它減輕了你的生活,而其他人則希望參考你的工作。 – HuStmpHrrr

+0

@HuStmpHrrr我使用2.7,我無法打包代碼,因爲它意味着從頭開始,這是不可行的。有沒有辦法做到這一點,而不必切換到包? –

+0

你只需要處理'pwd'或'cwd'問題。你只需將'../'追加到文件的路徑。 – HuStmpHrrr

回答

1

導入一個模塊是一個水平,你可以用這個。

import os, sys 
sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 

的解釋

__file__   # The full path to your running file. 
os.path.dirname  # See below. (1) 
os.path.join  # See below. (2) 
sys.path.append  # See below. (3) 
".."    # Universal for "up a level". 
  1. os.path.dirname(path) -

    Return the directory name of pathname path.

  2. os.path.join(path, *paths) -

    Join one or more path components intelligently.

  3. sys.path -

    A list of strings that specifies the search path for modules.

您可以添加一個字符串的Wi方法append

1

你應該使用絕對路徑:

import sys, os 
HERE = os.path.abspath(os.path.dirname(__file__)) 
sys.path.append(os.path.join(HERE, "..")) 

不過還好不這樣做:Guido views running scripts within a package as an anti-pattern

你應該把獨立腳本項目的根文件夾。腳本不應該被用作模塊和主腳本。

如果無法將腳本移動到根目錄,則在根目錄下創建另一個引導腳本,該腳本將導入運行其中專用功能的服務腳本。