我讀過下面的帖子:Python導入,包和運行的腳本
Relative imports for the billionth time
它說明了運行的文件作爲頂級腳本和導入它作爲顯着模塊之間的區別清晰度和細節。
但是我不知道如何編寫一個可運行腳本(if __name__ == '__main__'
等等)的導入方式,我也可以從我的測試中導入它,同時保持可運行的狀態腳本獨立(即不需要安裝包)。
說我有以下項目層次:
/reporoot
/mypkg
/mysubpkg
__init__.py
subpkgmodule.py
__init__.py
main1.py
main2.py
/tests
test_main1.py
test_main2.py
test_main1
需要以某種方式導入main1
,並且main1
需要以某種方式導入subpkgmodule
。 如果,例如,main1
進口subpkgmodule
像這樣:
import mysubpkg.subpkgmodule
這將運行該腳本的頂層腳本時,因爲頂層腳本有其目錄添加到sys.path
做工精細。但是,導入模塊時導入會中斷,因爲它的目錄不會被添加到sys.path
。
如果main1
是進口subpkgmodule
像這樣:
import mypkg.mysubpkg.subpkgmodule
當包是一個安裝包(包括python setup.py develop
),而不是運行作爲一個獨立的腳本,這隻會工作(即不幹了一些文件系統,運行python main1.py
)。
我看到標準庫的http.server
模塊有一個import http.client
,因此不能像我提到的那樣作爲獨立腳本運行。
對於我的可運行腳本的導入,乾淨的解決方案是什麼?
我曾經想過通過一些'testenv'模塊來做這件事,所有的測試都會先導入,但看起來不夠好看 – DoomMuffins