使用Python或其他嵌入式脚本语言部署应用程序

19

我在考虑在一个用C++编写的业余项目中使用Python作为嵌入式脚本语言。我不想依赖于单独安装的Python发行版。Python文档似乎对一般用法非常清晰,但我找不到清晰的答案。

是否可以部署带有Python解释器和标准库的我的应用程序?是否有其他语言,如Lua、Javascript(Spidermonkey)、Ruby等,更适合这种用途?

以下是我根据不同语言衡量的标准:

  • 没有/很少依赖于外部安装包
  • 内置良好的功能库
  • 语言特性好 :)
  • 不会导致巨大的安装包

编辑:

我想问题应该是: 如何使用我的程序安装程序部署自己的Python库+标准库,以便无论平台上是否已安装Python都无关紧要?

编辑2:

再澄清一下,我不需要关于链接C和Python代码的具体信息。

4个回答

19

将您的应用程序链接到Python库(Windows上的pythonXX.lib),并将以下内容添加到您的main()函数中。

Py_NoSiteFlag = 1;  // Disable importing site.py
Py_Initialize();    // Create a python interpreter

将你需要的Python标准库文件打包成一个zip文件(命名为pythonXX.zip),并将该zip文件和pythonXX.dll一起放在你要分发的可执行文件旁边。可以查看zipfile模块中的PyZipFile。


2
还应该注意,将Python文件放入zip文件中也会带来性能影响。虽然可以获得更小的安装大小,但启动时间会增加。这是因为每次启动时都必须解压缩和编译文件(它不会保存pyc文件)。 - Jason Baker
可以只分发 .pyc 文件吗?如果我们在用户只有读取权限的位置有 py 文件(未压缩),会发生什么? - John Smith
3
如果使用zipfile.PyZipFile创建归档文件,它只会压缩 .pyc 文件。你也可以手动创建归档文件。启动时间会缩短,因为zip头包含了所有模块的列表和它们的二进制偏移量。 - James Emerton
4
我找不到任何官方文件,你能给我指一下吗? - UncleZeiv
多年以后,我的搜索引导我找到了微软的这篇概述,它涵盖了所有内容。值得一提的是,外部包可以通过pip安装到您自己的本地安装中,然后将它们复制到pythonNN.zip文件中,就像它们是stdlib的一部分一样,这样当您的应用程序被分发时,它们将无需任何麻烦即可在CPython中使用。 - Hawkins
这里有一份很好的手册:https://www6.software.ibm.com/developerworks/education/l-pythonscript/l-pythonscript-ltr.pdf - Joniale

9
嵌入过程已经完全记录在文档中:将Python嵌入到其他应用程序中。 该文档建议在几个级别上进行嵌入,选择最符合您要求的级别即可。
源代码分发包的Demo/embed/目录中可以找到一个简单的嵌入Python演示。 这里是演示,应该能够从发行版中构建。
从标准库中,您可以选择不带太多依赖项的组件。具体包括:
- 非常高级别的嵌入 - 超越非常高级别的嵌入:概述 - 纯嵌入 - 扩展嵌入的Python - 在C++中嵌入Python

我认为问题不太清楚。我稍微编辑了一下。也许现在更准确了。 - John Smith

6

在gimel的回答基础上,没有任何阻止你将python.dll打包并使用它,并设置正确的PYTHONPATH以便使用你自己安装的Python标准库。它们只是库和文件,你的安装过程可以将它们视为这样的内容。


感谢您提供主题相关的答案。 :) - John Smith

0

如果你正在寻找一种简单部署 Python 应用程序的方法,你可以使用 Py2Exe。这将允许你的应用程序获取所有所需的依赖项,而不必担心用户机器上已经安装了什么或没有安装什么。

[编辑] 如果 Py2Exe 对于嵌入式应用程序不可行,那么你是否可以让你的安装程序检查相关文件并下载/安装任何缺失的内容?[/编辑]

[编辑2] Elmer 是否是你正在寻找的东西?[/编辑2]


我不确定(我自己从未尝试过)。Py2exe只是将一个Python应用程序及其所需的任何依赖项转换为单个可执行文件。 - Jon Cage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接