2014-03-31 17 views
0

做包,我有以下目錄結構:調用Python的自我從任何目錄

mydir/ 
    MyTask1/ 
     job1.py 
     MyPackage/ 
     __init__.py 
     cool_code.py 
     MyTask1_1/ 
     job2.py 
    MyTask3/ 
     job3.py 

我創建被稱爲MyPackage的包,__init__.py只包含一個文檔字符串。 我想要做的是從job2.pyjob3.py,我可以調用模塊通過以下方式

# job2.py or job3.py 
#!/usr/bin/python 
from MyPackage import cool_code 

我應該怎麼修改和添加,以實現這一目標?

回答

1

您可以修改sys.path以擴展模塊搜索路徑,例如。

import sys 
sys.path.insert(0,'/path/to/mydir/MyTask1') 
from MyPackage import cool_code 
+0

感謝。有什麼辦法可以修改'MyPackage'中的'__init __。py',這樣我就不必在每個'job * .py'代碼中執行sys.path.insert() – neversaint

+0

chicken-egg ...如果使用當前設置job2和job3沒有看到MyPackage,__init__文件將不會被加載,因此該文件中的更改不會使其在不同的目錄中可見。但是你可以在你的系統中改變PYTHONPATH環境變量,以便使這個包對所有的Python腳本都可見 – Gryphius

0

從job2.py:

PROJ_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) 
if not PROJ_ROOT in sys.path: 
    sys.path.append(PROJ_ROOT) 
from mydir.MyTask1.MyPackage import cool_code 

從job3.py:

PROJ_ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) 
if not PROJ_ROOT in sys.path: 
    sys.path.append(PROJ_ROOT) 
from mydir.MyTask3 import cool_code 
0

你可以你的模塊路徑相對明確,以__init__.py並定義模塊結構。你可以在這裏找到例如:https://docs.python.org/2/tutorial/modules.html#packages

如果要加載的同時:

from MyPackage import cool_code 

可以在__init__.py使用__all__如下定義:https://docs.python.org/2/tutorial/modules.html#importing-from-a-package

+0

'你可以定義你的模塊路徑相對於__init __。py'你可以給出具體的例子來解決我的問題嗎? – neversaint

+0

在https://docs.python.org/2/tutorial/modules.html#packages上有一個示例。我給了鏈接... – user3