2013-01-14 121 views
0

我有一個由我使用的幾個科學程序模塊組成的個人python庫。這些生活在一個目錄的結構:針對不同體系結構的軟件包python目錄

root/__init__.py 
root/module1/__init__.py 
root/module1/someprog.py 
root/module1/ (...) 
root/module2/__init__.py 
root/module2/someprog2.py 
root/module2/somecython.pyx 
root/module2/somecython.so 
root/module2/somefortran.f 
root/module2/somefortran.so 
(...) 

我不斷對這些程序進行更改並添加新文件。通過我目前的設置,我可以與幾臺不同架構的機器共享相同的目錄。我想要的是在不同的體系結構中使用Python中的這些包的方法。如果軟件包都是純Python,這將是沒有問題的。但問題是我有幾個從Cython和f2py編譯的二進制文件(如示例中所示)。

是否有一種巧妙的方式來重新包裝這些二進制文件,以便不同系統中的python只導入相關的二進制文件?我想保持代碼組織在同一個目錄中。

顯然,最簡單的方法是複製目錄或創建另一個符號鏈接目錄。但這意味着當創建新文件時,我不得不手動更新符號鏈接。

有沒有人碰到類似的問題,或者可以建議對這個組織問題更pythonic方法?

回答

0

不幸的是沒有辦法做到這一點。一個python包必須完全駐留在一個目錄中。 PEP 382建議支持可以拆分到不同目錄的名稱空間包,但它被拒絕。 (並且在任何情況下,這些都是特殊的包)。

鑑於python包必須位於單個目錄中,因此不可能爲不同的體系結構混合編譯的擴展模塊。有兩種方法可以緩解此問題:

  1. 將二進制擴展保存在單獨的目錄中,並將所有python軟件包放在可在架構之間共享的公用目錄中。然後可以爲PYTHONPATH針對不同的體系結構選擇二進制擴展的單獨目錄。
  2. 爲不同的架構保留一個包含所有python文件和擴展名的公共目錄。對於每個體系結構,使用軟件包名稱創建一個新目錄。然後符號鏈接每個這些目錄中的所有python文件和二進制文件。這仍然允許代碼所在的一個地方,而不必爲每個新文件創建新的符號鏈接。

Thorsten Krans建議的選項不幸的是不適合這個問題。使用distutils/setuptools/distribute仍需要將所有的python源文件安裝在每個體系結構的目錄中,否定將它們放在單個目錄中的優勢。 (這不是一個完整的包,但始終工作正在進行。)

1

也許您應該使用setuptools/distribute。然後,您可以定義一個setup.py,根據您當前的平臺編譯所有文件,將它們複製到一個合適的目錄並確保它們在您的sys.path中可用。

+0

但不將setuptools的方式只是把包放到不同的目錄?我想要的是保持源文件(.py,.pyx,.f)的集中版本以及獨立於架構相關文件的位置的方法。 – tiago

0

當您編譯python的源代碼時,您會執行以下操作。

傳遞EXEC前綴標誌與目錄運行./configure

欲瞭解更多信息:。/配置--help會給你以下幾點:

安裝目錄: --prefix = PREFIX安裝在PREFIX 架構無關的文件[在/ usr /本地] --exec前綴= EPREFIX安裝架構相關的在EPREFIX [PREFIX]

希望文件這有助於:)