2013-04-28 33 views
1

是否可以用py2exe(或類似的)「編譯」Python腳本,然後允許用戶訪問修改頂級Python腳本?或者可能將編譯後的模塊導入到它們的普通Python腳本中?我正在尋找爲某些客戶分發簡單安裝程序的功能,但允許其他客戶通過創建自己的腳本來搭建已安裝的框架模塊,如API。如何使用py2exe製作Python API?

我試圖使用py2exe來導入我放在「dist」目錄中的文件,但它抱怨說它們沒有被凍結。爲什麼不能使用混合冷凍二進制模塊和解釋模塊?

我使用py2exe的原因是因爲我有一些麻煩的庫(paramiko/pycrypto,加上一些內部開發的庫),我不想要我的客戶跋涉這些安裝。我也不希望他們有開放的訪問我的框架文件。我知道他們可以反編譯py2exe對象,但他們將不得不修改框架,這是足夠好的保護。

回答

0

是否有可能「編譯」 Python腳本與py2exe(或類似) 然後允許用戶訪問和修改頂級的Python腳本?

我不是特別熟悉py2exe,但看tutorial page,似乎相對簡單沿着線的東西來代替hello.py腳本...

import sys 
import os 

# Import your framework here, and anything else you want py2exe to embed 
import my_framework 

TOP_LEVEL_SCRIPT_DIR = '/path/to/scripts' 
MAIN_SCRIPT = os.path.join(TOP_LEVEL_SCRIPT_DIR, 'main.py') 

sys.path.append(TOP_LEVEL_SCRIPT_DIR) 
execfile(MAIN_SCRIPT) 

...並把你想讓用戶在/path/to/scripts中修改的任何腳本,儘管將TOP_LEVEL_SCRIPT_DIR定義爲相對於二進制文件的路徑可能更有意義。

,我使用py2exe的原因是因爲我有一些麻煩 庫(的paramiko/pycrypto,再加上一些內部開發的) ,我不希望我的要求客戶通過這些 安裝跋涉。我也不希望他們對我的 框架文件有開放訪問權限。

如果目標是安裝方便,它也可能足以創建一個普通的InstallShield式的安裝程序將所有文件都在正確的地方,只是包括.pyc版本的「框架文件」,如果你不希望他們閱讀源代碼。

1

我想出瞭如何讓它工作。我將我的「head」框架文件放在setup.py文件的「includes」列表中。然後,我有一個使用imp模塊動態加載常規Python腳本的compliled runner,並且這些腳本會調用該頭文件。這正是那種隱藏的框架,但我一直在尋找API。

例如,假設我們有一個名爲「framework」的目錄,其中包含所有API調用的主文件「foo」。 py2exe設置中的行。PY文件應該是這樣的:

includes = ['framework.foo', 'some_other_module', 'etc'] 

我那麼做這個亞軍腳本的目標:

FrameworkTarget = Target(
    # what to build 
    script = "run_framework.py", 
    dest_base = "run_framework" 
    ) 

然後在setup.py腳本中的目標添加到設置()命令的其他中事情:

console = [FrameworkTarget], 

編譯亞軍腳本傳遞命令行的「測試套件」腳本的名稱:

test_suite_name = sys.argv[1] 
file_name = test_suite_name + ".py" 
path_name = os.path.join(os.getcwd(), file_name) 
print "Loading source %s at %s"%(file_name, path_name) 
module = imp.load_source(file_name, path_name) 

然後,由imp.load_source()命令調用的文件中,我有這樣的:

import framework.foo 

當我沒有在我的包括「framework.foo」,它找不到framework.foo的編譯版本。也許有人會在未來發現它有用。我不知道我是否可以在沒有Stackoverflow的情況下做一件有用的事情!