2011-02-24 53 views
0

我知道這是一個愚蠢的問題,但我很難過。用看起來像這樣我的目錄結構:我的Python路徑有問題

-src 
    | 
    -module.py 
    -program.py 

當這就是我的目錄結構,我從程序引用模塊,一切都很好。

因爲我已經改變了我的目錄結構如下:

-src 
    | 
    -__init.py 
    -module.py 
    | 
    -programDir 
    | 
    -__init.py 
    -program.py 

現在,當然,我不能達到從程序模塊。我如何將src作爲一個包引用?我試圖創建一個

__init__.py 

文件在src目錄中,但沒有運氣。

Moar DEETS: import語句我試過在program.py:

import module 

from src import module 

當其他模塊和程序在同一個目錄中的第一個工作。

錯誤我越來越:

ImportError: No module named module 

,只是備案:不,我的模塊和程序不調用的模塊或程序

更新:我已經在我的程序嘗試這個。 PY文件:

from ...src import module 

from ..src import module 

兩者都是給我:

ValueError: Attempted relative import in non-package 
+0

莫爾細節!例如,導入語句的外觀以及您得到的錯誤。 – delnan 2011-02-24 20:56:46

回答

1

Couldn你用PEP 328來解決這個問題嗎?

+0

這看起來很有希望。我將不得不在明天玩弄它,並讓你知道它是如何發生的。 – Ramy 2011-02-25 00:44:05

+0

你能看看我最近的編輯嗎?我似乎仍然得到一個ValueError – Ramy 2011-02-25 15:46:04

+0

剛剛意識到我正在使用ironPython。不確定這是否適用於IPy。 – Ramy 2011-02-25 16:39:24

0

如果你直接運行program.py,與python program.py#!,然後module.py的目錄應該是在PYTHONPATH爲import module工作。這可以使用你覺得保持programDir,例如一個幫手shell腳本來實現,並且看起來像:

#!/bin/bash 

script_dir=`dirname $0` 
# Add the script's parent directory to the PYTHONPATH 
export PYTHONPATH=$PYTHONPATH:$script_dir/.. 

python $script_dir/program.py 

另一個,可能會更好,這樣將有program.py出口「main()」的功能,並創建一個在src/program幫手python腳本,看起來像:

#!/usr/bin/env python 
from programDir.program import main 
main() 

在這種情況下,您可以使用src/programDir/program.py相對進口,所以這應該工作:

from .. import module 
+0

你的意思是src/programDir?我不確定我是否明白這一點。 – Ramy 2011-02-24 21:22:52

0

第一個工作是因爲Python的sys.path的第一個條目是'',這意味着它將在您執行Python解釋器的當前工作目錄中查找模塊名稱。

您似乎遇到的問題是位於src的目錄未在您的PYTHONPATH上設置。所以,你可以做的是明確地設置PYTHONPATH環境變量。

下面是一個例子使用bash:

export PYTHONPATH=PATH_TO_SRC:${PYTHONPATH} 

後運行程序正常

另一種方法是,你可以明確地在你的程序執行追加到它設置sys.path

因此,在你program.py,你會:

if __name__ == '__main__': 
    import os 
    import sys 
    sys.path.append(os.path.dirname(os.path.dirname(__file__))) 
    your_main_function() 

最後,對於嚴重的Python開發,你應該考慮virtualenvvirtualenvwrapper,因爲它會照顧大多數的這些東西給你。

0

您需要將__init__.py添加到/programDir才能將目錄解釋爲包。一旦一個包,你可以導入包的內容。

所以,你的情況,如果/src是在PYTHONPATH,從module.py你可以用from programDir import program導入program.py

+0

但它是我想要做的另一種方式。我想從程序導入模塊。所以在program.py中,我試圖做「導入模塊」 – Ramy 2011-02-24 21:13:25

+0

如果'/ src'在'PYTHONPATH'中,你可以執行'import module'。如果沒有,添加一個'__init __。py',你可以從'program.py'執行一個相對導入:'from .. import module' – 2011-02-24 21:29:38

2

對於初學者,我建議閱讀文檔中的條目Modifying Python's Search Path

它可能在被一些人皺起了眉頭,但如果你想從你的程序中修改PYTHONPATH,根據文檔的standard modules條目可以使用sys.path.append方法:

import sys 
sys.path.append('..') 
import module 
+0

以及這個工作。我希望有一些更優雅的東西 - 比如創建一個包的方式 - 但是這種方式現在可行。 – Ramy 2011-02-24 21:29:54

0

如果使用程序作爲程序包的一部分,在另一蟒模塊,如

import src.programDir.program as p 

p.some_method() 

可以使用相對導入在program.py,假設你在兩個創建與Src的軟件包(__init__.py src和PROGRAMDIR)

from .. import module 

如果不是這樣,比如你是從從命令行調用program.py,您必須通過前祁門功夫修改sys.path或PYTHONPATH的環境變量,添加包含SRC到您的搜索路徑的目錄婷。