1

是否可以使用 py2exe (或类似的)“编译” Python 脚本,然后允许用户访问修改顶级 Python 脚本?或者可能将编译后的模块导入到它们的普通 Python 脚本中?我正在寻找为某些客户分发简单安装程序的能力,但允许其他客户通过创建自己的脚本来构建已安装的框架模块,如 API。

我尝试使用 py2exe 导入我放在“dist”目录中的文件,但它抱怨它们没有被冻结。为什么它不能混合使用冻结的二进制模块和解释模块?

我使用 py2exe 的原因是因为我有一些麻烦的库(paramiko/pycrypto,以及一些内部开发的库),我不想要求我的客户在这些安装中跋涉。我也不希望他们开放访问我的框架文件。我知道他们可以反向编译 py2exe 对象,但他们必须努力修改框架,这已经足够保护了。

4

2 回答 2

1

我想出了如何让它工作。我将我的“头”框架文件放在 setup.py 文件的“包含”列表中。然后,我有一个编译好的运行器,它使用 imp 模块动态加载常规 Python 脚本,这些脚本调用该头框架文件。这正是我一直在寻找的那种隐藏的框架,但可以访问的 API。

例如,假设我们有一个名为“framework”的目录,其中包含一个包含所有 API 调用的主文件“foo”。py2exe setup.py 文件中的行如下所示:

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

然后我为这个运行脚本制定一个目标:

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

然后将目标添加到 setup.py 脚本中的 setup() 命令中:

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,我是否可以做一件有用的事情!

于 2013-04-29T06:37:05.763 回答
0

是否可以使用 py2exe (或类似的)“编译” Python 脚本,然后允许用户访问修改顶级 Python 脚本?

我不是特别熟悉py2exe,但是查看教程页面,将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如果您不希望它们阅读源代码。

于 2013-04-28T07:58:31.610 回答