如何使用py2exe制作Python API?

时间:2013-04-28 03:35:15

标签: python py2exe

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

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

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

2 个答案:

答案 0 :(得分:1)

我想出了如何让它发挥作用。我将“head”框架文件放在setup.py文件的“includes”列表中。然后,我有一个使用imp模块动态加载常规Python脚本的compliled runner,这些脚本调用该头文件。这正是我所寻找的隐藏框架,但可访问的API。

例如,假设我们有一个名为“framework”的目录,其主文件“foo”包含所有API调用。 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],

编译的runner脚本从命令行传递“test suite”脚本的名称:

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

答案 1 :(得分:0)

  

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

我对py2exe并不是特别熟悉,但是查看tutorial page,将hello.py脚本替换为某些内容似乎相对简单...... < / p>

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定义为相对于二进制文件的路径可能更有意义。 / p>

  

我使用py2exe的原因是因为我有些麻烦   图书馆(paramiko / pycrypto,加上一些内部开发的)   我不想要求我的客户跋涉这些   安装。我也不希望他们对我有开放的访问权限   框架文件。

如果目标是易于安装,也可以创建一个常规的InstallShield-esque安装程序,将所有文件放在正确的位置,并且只包含“{1}}版本的”框架文件“你不希望他们阅读源代码。