2013-04-28 48 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的情况下做一件有用的事情!