2012-07-23 138 views
21

在組織Python項目,這種結構似乎是做它的標準方式:如何從bin文件夾中的腳本導入你的包/模塊蟒蛇

myproject\ 
    bin\ 
     myscript 
    mypackage\ 
     __init__.py 
     core.py 
    tests\ 
     __init__.py 
     mypackage_tests.py 
setup.py 

我的問題是,我該如何導入mycore.py所以我可以在myscript中使用它?

兩個__init__.py文件都是空的。

內容的MyScript的:core.py的

#!/usr/bin/env python 
from mypackage import core 
if __name__ == '__main__': 
    core.main() 

內容

def main(): 
    print 'hello' 

當我從MyProject的目錄內運行的MyScript,我得到以下錯誤:

Traceback (most recent call last): 
    File "bin/myscript", line 2, in <module> 
    from mypackage import core 
ImportError: No module named mypackage 

什麼我錯過了嗎?

+0

您的'sys.path'值(由'PYTHONPATH'環境變量修改或在Python代碼運行時修改)確定'import'將在哪裏搜索模塊。 – Borealid 2012-07-23 12:43:12

+2

考慮在setup.py中使用'entry_points [「console_scripts」]「''。 – kojiro 2012-07-23 12:43:58

+1

'setup.py'的內容是什麼?它在myproject目錄中嗎? – mgilson 2012-07-23 12:44:05

回答

4

通常情況下,setup.py應該安裝在Python解釋器可以找到它的地方,所以安裝import mypackage將工作。爲了便於在開發樹上運行bin中的腳本,我通常只需將../mypackage/的simlink添加到bin目錄。當然,這需要一個文件系統支持符號鏈接...

+0

正如您所建議的那樣使用符號鏈接,該腳本能夠找到mypackage,但我現在遇到了另一個問題......請參閱我在上述問題中的編輯。 – 2012-07-23 12:57:24

+6

使用[virtualenv](http://pypi.python.org/pypi/virtualenv/)並運行'python setup.py develop'來讓distutils將可執行文件安裝到路徑中,而不是使用「clever」符號鏈接進行開發(當你激活了virtualenv) – SingleNegationElimination 2012-07-23 13:01:52

+0

其實,我發現了另一個問題。 – 2012-07-23 13:41:30

0

我不知道如果有一個「最好的選擇」,但下面是我通常的做法:無論劇本,我想在運行

  1. 認沽/ bin中

  2. 做 「蟒蛇-m bin.script」 在DIR MYPROJECT

  3. 在script.py導入時,考慮其script.py坐在爲根迪爾。所以

    from ..mypackage import core 
    

如果系統支持符號鏈接,這是一個更好的選擇。