2009-05-19 222 views
3

在我開發的Python系統中,我們通常有這個模塊結構。Python導入:導入一個沒有.py擴展名的模塊?

mymodule/ 
mymodule/mymodule/feature.py 
mymodule/test/feature.py 

這讓我們的小測試框架能夠輕鬆地導入測試/ feature.py並運行單元測試。然而,我們現在有一些shell腳本(這是用Python編寫的)需要:

mymodule/ 
mymodule/scripts/yetanotherfeature.py 
mymodule/test/yetanotherfeature.py 

yetanotherfeature.py由模塊Debian包到/ usr/bin中安裝。但我們顯然不希望在那裏有.py擴展名。所以,爲了使測試框架,仍然能夠導入模塊,我必須這樣做符號鏈接的thingie:

mymodule/ 
mymodule/scripts/yetanotherfeature 
mymodule/scripts/yetanotherfeature.py @ -> mymodule/scripts/yetanotherfeature 
mymodule/test/yetanotherfeature.py 

是否有可能通過文件名Python中導入模塊,或者你能想到的更優雅的解決方案呢?

+2

這有什麼錯符號鏈接?這是處理這件事的最優雅的方式。你也應該使用它進行部署。/usr/bin/feature是指向/usr/bin/feature.py的鏈接,通過使實現清晰可見。 – 2009-05-19 10:40:00

回答

1

你可以最有可能通過進口hooks使用一些tricker,我不會,雖然推薦它。另一方面,我也可能會以相反的方式做到這一點,將.py腳本放在某處,然後製作'.py'符號鏈接到.py文件。所以你的庫可以在任何地方,你可以通過導入它來正常運行測試(因爲它有py擴展名),然後/ usr/bin/yetanotherfeature指向它,所以你可以在不運行py的情況下運行它。

編輯:沒關係本(至少是部分掛鉤),進口小鬼解決方案看起來對我很好:)

9

imp module用於此:

[email protected]:/tmp/test$ cat mymodule 
print "woho!" 
[email protected]:/tmp/test$ cat test.py 
import imp 
imp.load_source("apanapansson", "mymodule") 
[email protected]:/tmp/test$ python test.py 
woho! 
[email protected]:/tmp/test$ 
+3

這將創建一個名爲「mymodulec」的文件。它應該是.pyc,但是由於原始文件並沒有以.py結尾,所以它最後只是指向一個c。這很奇怪。我可以讓它不這樣做嗎? – 2009-06-16 03:52:52

+0

如果您不想要創建「mymodulec」,請設置「sys.dont_write_bytecode = True」 – 2012-07-17 03:33:53

0

另一種選擇是使用setuptools的:

」 ...有沒有簡單的方法讓腳本的文件名與Windows和POSIX平臺上的本地約定匹配;另一方面,當你的實際「main」是模塊中的某個函數時,你通常必須爲「main」腳本創建一個單獨的文件... setuptools通過爲您自動生成具有正確擴展名的腳本來修復所有這些問題,並且在Windows上它甚至會創建一個.exe文件...「

https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation

相關問題