2013-03-27 55 views
3

(我知道有很多關於蟒蛇相對進口StackOverflow上的問題,我也懷疑是我做的這一切都錯了,但在這裏不用反正..)使用Git子模塊導入一個Python項目

我有一個Python項目(mysubmod)安排如下:

/__init__.py 
/lib 
- /__init__py 
- /foobar.py 
/models 
- /__init__.py 
- /hello.py 

重要:

  • /models/hello.py進口lib.foobar
  • /models/hello.py具有運行某些測試一個

然後我有進我已經導入mysubmod作爲一個git子模塊的第二項目(的Myproj);的Myproj現在安排如下 -

/mysubmod 
/scripts 
- /__init__.py 
- /__test.py 

其中:

  • 腳本/ test.py進口mysubmod.models.hello

然而,當我運行/scripts/test.py從在命令行中,解釋器現在抱怨mysubmod/models/hello.py不能再找到lib.foobar。

重新加載。

更改mysubmod /模型/ hello.py所以現在進口..lib.foobar

現在我可以毫無怨言運行/scripts/test.py,但我再也不能運行任何submod腳本作爲來自命令行的文件;我只能使用python -m選項將它們作爲模塊運行。

此外,即使使用-m選項,我也無法再獨立運行子模塊項目文件,因爲解釋器抱怨「嘗試相對導入超出頂層包」;我必須上一個目錄級別,即只能真正從myproj根目錄(其中mysubmod作爲根級目錄)運行mysubmod。

這一切似乎相當不滿意。我希望能夠到:

  • 使用git子模塊導入mysubmod到的Myproj,使其「只是工作」
  • 繼續能夠開發一個獨立的基礎(即運行腳本上mysubmod作爲模塊文件不)

有沒有人有關於如何做到這一點的任何意見?有關git子模塊和python的最佳實踐的任何觀點?

謝謝。

回答

5

確定的答案是(很多彎路之後)

  • 添加一個頂級包mysubmod(例如「的HelloWorld」)
  • 與導入myprod作爲子模塊mysubmod,象徵性地鏈接了HelloWorld包入myprod根(「LN -s mysubmod /的HelloWorld的HelloWorld」)

這種方式,封裝結構被保持是否正在與submod作爲子模塊或上一個獨立的基礎工作。

1

當您啓動「myproj」時,您還可以在sys.path中添加「mysubmod」。然後當「mysubmod/models/hello.py」會找到lib.foobar。

+1

是的,這似乎是一個更好的解決方案。 [這個答案](http://stackoverflow.com/a/29747054/477453)提供了一個例子。 – 2015-06-29 09:29:38

相關問題