2012-12-28 69 views
2

我已經看過其他的python模塊分發問題。我的需求有點不同(我認爲!,我是Python新手+)捆綁/執行Python腳本+模塊到遠程機器

我有一堆python腳本,我需要在遠程機器上執行。這是目標環境的樣子;

  • 機器將安裝基礎的Python運行時
  • 我將有一個SSH賬戶;我可以使用ssh遠程登錄或執行命令
  • 我可以將文件(scp)複製到我的家目錄
  • 我不允許在機器上安裝任何東西;機器甚至可能無法訪問互聯網
  • 我的腳本可能會使用一些「異國情調」的python模塊 - 很可能它們將不會出現在目標機器上
  • 審計後,我的主目錄將被屏蔽機器(不留痕跡)

所以我想要做的是:

  • 副本Python腳本+模塊遠程機器(比如在/ home/audituser /腳本)的目錄結構。和模塊可以複製到/ home/audituser/scripts/pythhon_lib)
  • 然後執行一個腳本(比如說/home/audituser/scripts/myscript.py)。該腳本需要解析'python_lib'子目錄中使用的所有模塊。

這是可能的嗎?還是有更好的方法來做到這一點?我想我所看到的是將第三方模塊「重新定位」到腳本目錄中。

在此先感謝!

+0

我會嘗試這些建議;儘管我認爲他們可能比我需要的更多。 有沒有什麼辦法可以通過按摩PYTHON_PATH來做到這一點? –

+0

嗯,它是'PYTHONPATH',而不是'PYTHON_PATH'。我不知道爲什麼你需要按摩它。如果只是將模塊複製到腳本目錄中,只需複製它們即可,不需要'PYTHONPATH'。如果要弄清楚哪些模塊難以收集,或者需要C擴展模塊和C依賴關係,或者由於其他原因,這不會起作用,「PYTHONPATH」將無濟於事。如果你想按摩'PYTHONPATH',當然你可以 - 或者更簡單地說,從腳本內部按摩'sys.path' - 但是如果你不知道你想用它做什麼,你可能不會'不需要它。 – abarnert

回答

2

您可以使用virtualenv爲您的項目創建一個自包含的環境。這可以容納您自己的腳本以及任何依賴庫。然後,您可以使env可重定位(--relocatable),並將其同步到目標機器,激活它並運行腳本。

如果這些機器確實有網絡訪問權限(不是互聯網,但只是本地網絡),您還可以將virtualenv放在共享位置並從那裏激活。

它看起來是這樣的:

virtualenv --no-site-packages portable_proj 
cd portable_proj/ 
source bin/activate 
# install some deps 
pip install xyz 
virtualenv --relocatable . 

現在portable_proj可以disted到其他機器。

3

遠程機器是否彼此相同?而且,如果是這樣,你能建立一個和遠程機器一樣的開發機器嗎?

如果是這樣,virtualenv使這幾乎微不足道。在您的開發機器上創建一個virtualenv,使用pip的副本pip將任何第三方模塊安裝到其中,在其中構建您的腳本,然後將該整個環境複製到每個遠程計算機。

有三樣東西,使得它潛在的不平凡:

  • 如果遠程計算機都沒有(也不可能)安裝virtualenv,你需要做以下之一:
    • 在很多情況下,只需複製--relocatable環境即可。請參閱關於「使環境可重新定位」的文檔部分。
    • 您可以在每臺機器上始終捆綁virtualenv本身和pip install --user virtualenv(並且,如果它們甚至沒有pip,則在此之前幾個步驟)。這將使用戶帳戶處於永久更改的狀態。 (但幸運的是,您的用戶帳戶將被刪除,所以誰在乎?)
    • 您可以編寫自己的手動引導。請參閱「創建自己的引導腳本」一節。
    • 默認情況下,你會得到比你需要的更多的東西 - Python可執行文件,標準庫等。
    • 如果機器不相同,這可能無效,或者至少效率可能不高。
    • 即使他們是,你仍然經常使你的捆綁訂單更大。
    • 請參閱有關使用不帶bin/python的Virtualenv,--system-site-packages以及可能的自引導文檔部分。
  • 如果任何你還要安裝Python模塊的需要C庫(例如,libxml2lxml),virtualenv不會與幫助。事實上,您將需要C庫幾乎完全相同(相同路徑,兼容版本)。其他

三種選擇:

  • 如果你的需求是很簡單(或最少簡單的零件涉及的事情,virtualenv不幫助,如安裝libxml2),它可能更容易只將第三方模塊的.egg/.tgz /任何文件捆綁在一起,然後編寫一個腳本,爲每個模塊創建一個pip install --user等等,然後就完成了。
  • 僅僅因爲你不需要需要一個完整的應用程序分發系統並不意味着你不能使用它。 py2apppy2execx_freezecx_freeze等都不是全部複雜,特別是在簡單的情況下,並且具有點擊即走的可執行文件來複制比有明確的環境更容易。
  • zc.buildout是一個令人驚訝的靈活和可管理的工具,可以做任何三個替代品的等值。主要的缺點是有一個更陡峭的學習曲線。
相關問題