如何创建一个在没有本地Python安装的情况下嵌入并运行Python代码的应用程序?

如何创建一个在没有本地Python安装的情况下嵌入并运行Python代码的应用程序?,python,c,dll,distribution,Python,C,Dll,Distribution,各位软件开发人员好 我想发布一个C程序,它可以通过嵌入Python解释器编写脚本。 C程序使用Py_Initialize、PyImport_Import等实现Python嵌入 我正在寻找一种只分发以下组件的解决方案: 我的程序可执行文件及其库 Python库(dll/so) 包含所有必要Python模块和库的ZIP文件 我怎样才能做到这一点?有没有一个循序渐进的方法 该解决方案应适用于Windows和Linux 提前谢谢。你看了吗?不需要安装任何东西。只需复制包含的文件即可使用解释器 编辑:

各位软件开发人员好

我想发布一个C程序,它可以通过嵌入Python解释器编写脚本。
C程序使用Py_Initialize、PyImport_Import等实现Python嵌入

我正在寻找一种只分发以下组件的解决方案:

  • 我的程序可执行文件及其库
  • Python库(dll/so)
  • 包含所有必要Python模块和库的ZIP文件
我怎样才能做到这一点?有没有一个循序渐进的方法

该解决方案应适用于Windows和Linux

提前谢谢。

你看了吗?不需要安装任何东西。只需复制包含的文件即可使用解释器

编辑:这是一个仅适用于Windows的解决方案。

您看过Python文档吗


一旦有了它,您就可以使用导入钩子(请参阅)让嵌入式Python代码从您选择的任何地方加载模块。但是,如果您将所有内容都放在一个zipfile中,那么您可能只需要将其作为
sys.path

上的唯一条目。您看过Python的官方文档了吗:

还有一个IBM提供的非常好的PDF:


使用这两种资源,您应该能够做您想做的事情。

我只是在一台没有安装Python的计算机上测试了我的可执行文件,并且它工作正常

当您将Python链接到可执行文件(无论是动态的还是静态的)时,您的可执行文件已经获得了基本的Python语言功能(操作符、方法、基本结构,如字符串、列表、元组、dict等),而没有任何其他依赖性

然后我让Python的setup.py通过
Python setup.py sdist--format=zip
编译一个Python源代码发行版,它给了我一个名为
pylib-2.6.4.zip
的zip文件

我的进一步步骤是:

char pycmd[1000]; // temporary buffer for forged Python script lines
...
Py_NoSiteFlag=1;
Py_SetProgramName(argv[0]);
Py_SetPythonHome(directoryWhereMyOwnPythonScriptsReside);
Py_InitializeEx(0);

// forge Python command to set the lookup path
// add the zipped Python distribution library to the search path as well
snprintf(
    pycmd,
    sizeof(pycmd),
    "import sys; sys.path = ['%s/pylib-2.6.4.zip','%s']",
    applicationDirectory,
    directoryWhereMyOwnPythonScriptsReside
);

// ... and execute
PyRun_SimpleString(pycmd);

// now all succeeding Python import calls should be able to
// find the other modules, especially those in the zipped library

...

有一个程序叫py2exe。我不知道它是否只适用于Windows。此外,我使用的最新版本并没有将所有内容打包到一个.exe文件中。它创建了一堆必须分发的东西——一个zip文件等等。

我想这就是你想要的答案

基本上,您需要:

Py_NoSiteFlag=1;
Py_SetProgramName(argv[0]);
Py_SetPythonHome(".");
Py_InitializeEx(0);
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path = ['.','python27.zip','python27.zip/DLLs','python27.zip/Lib','python27.zip/site-packages']");
在c/c++代码中加载python标准库

python27.zip
中,所有
.py
源代码都位于
python27.zip/Lib
,如
sys.path
变量所述


希望这有帮助。

我删除了我的答案,因为它不适用。您可能想编辑这个问题,这样就可以清楚地看到您正在将Python嵌入C应用程序中。但这不是我要找的。不应该有任何其他依赖性。啊,我应该在发布之前刷新评论。。。!我是按照嵌入指南做的,效果不错。标题似乎有误导性——Python是嵌入的。我不想将Python代码嵌入到可执行文件中——通过链接到Python,可执行文件将变得可编写脚本。因此,py2exe不是解决方案。