需要哪些文件Py_Initialize运行?需要哪些文件Py_Initialize运行?(What

2019-05-12 08:49发布

我的工作一段简单的代码运行从C / C ++应用Python函数。 为了做到这一点,我设置PYTHONPATH和初始化运行,如下所示:

Py_SetPythonHome("../Python27");
Py_InitializeEx(0);

然后导入我的模块和运行我的功能。 它的伟大工程。

我现在试图建立一个安装程序为我的同事到我的代码运行。 我希望尽量减少我需要在这个安装程序包括,出于显而易见的原因文件的数量。

围绕主题谷歌搜索告诉我,我应该能够包含的文件“Python27.lib”和“Python27.dll”,然后将拉链“的dll”和“库”文件夹,并囊括其中。 然而,当我尝试此,Py_Initialize失败。

是什么原因造成这种故障的快速检查表明,Py_Initialize似乎取决于lib文件夹中的一些pyc文件,包括(但不限于warnings.pyc,_abcoll.pyc,_future_.pyc和“编码的内容“文件夹中。

我不明白为什么会。 有什么建议?

Answer 1:

在开始的时候,我想说的话,有没有需要的模块(至少没有非内置之一)Py_InitializeEx,所以唯一的要求是python27.dll(顺便说一句:python27.lib 不是必需的,除非你的同事要链接的东西反对-但不会很容易W / O Pythoninclude目录)。 我有这个代码( 顺便说一句 :我使用Python 2.7.10,我用VStudio 10(2010 )所建):

#include <stdio.h>
#include <conio.h>
#include <Python.h>

int main() {
    int i = 0;
    char *pyCode = 
        "s = \"abc\"\n"
        "print s, 1234";
    Py_InitializeEx(0);
    i = PyRun_SimpleString(pyCode);
    Py_Finalize();
    printf("PyRun_SimpleString returned: %d\nPress a key to exit...\n", i);
    _getch();
    return 0;
}

它建立了良好的,它跑了好从VStudio,并通过命令行(复制后的文件夹中的.dll文件 )。 但后来我复制的.exe.dll到另一台计算机并运行时, 砰!

ImportError: No module named site 

考虑到:

  • 我没有PYTHON * ENV乏既不在2台机器的游戏机的设置,我跑了的.exe(产生不同的结果)
  • 在两台机器上Python的安装在同一路径上(我以前(年前)修改了它不工作的机器上)

我不知道为什么它不具有相同的行为(一两件事,我还没有检查的是,有可能是工作的机器上的一些注册表项?)。

注意网站是一个( 的.py(C))位于%PYTHON_INSTALL_DIR%\库模块。

然后,我浏览Python的源代码,我遇到了这个(文件:pythonrun.c,:269,功能Py_InitializeExpythonrun.c:269:Py_InitializeEx -这是我要如何在源参考点码):

    if (!Py_NoSiteFlag)
        initsite(); /* Module site */

而在pythonrun.c:727:initsite:

    m = PyImport_ImportModule("site");

这是很明显的(Py_NoSiteFlag为0)。

突然,我注意到Py_NoSiteFlag被声明为extern __declspec(dllexport) ( [MS.Docs]:使用EXTERN到指定联动 , [MS.Docs]:DLLEXPORT,dllimport的 ),所以我修改我的代码:

#include <stdio.h>
#include <conio.h>
#include <Python.h>

extern __declspec(dllimport) int Py_NoSiteFlag;

int main() {
    int i = 0;
    char *pyCode = 
        "s = \"abc\"\n"
        "print s, 1234";
    Py_NoSiteFlag = 1;
    Py_InitializeEx(0);
    i = PyRun_SimpleString(pyCode);
    Py_Finalize();
    printf("PyRun_SimpleString returned: %d\nPress a key to exit...\n", i);
    _getch();
    return 0;
}

和它的作品! 好极了!

所以,在这一点上只有.dll文件要求是为了运行一段代码。 但是我想,你的代码是“一点点”比这更复杂的(它有进口 S( [Python的2]:import语句 )。为了解决进口问题,你可以使用这个漂亮的模块: [Python的2]: modulefinder -查找脚本使用的模块 (Python 2.7版的标准模块的一部分)来使用它。

  • 保存从C.py文件执行代码
  • 运行modulefinder反对

下面是我的代码(在我的C程序pyCode内容保存在文件中)的一个例子。

code.py:

s = "abc"
print s, 1234

运行

%PYTHON_INSTALL_DIR%\python %PYTHON_INSTALL_DIR%\Lib\modulefinder.py code.py 

收益率:

 Name File ---- ---- m __main__ code.py 

但是 ,如果我添加一个import os (这是一个很常见的模块)语句文件中,上面的命令得到:

 Name File ---- ---- m StringIO %PYTHON_INSTALL_DIR%\lib\StringIO.py m UserDict %PYTHON_INSTALL_DIR%\lib\UserDict.py m __builtin__ m __future__ %PYTHON_INSTALL_DIR%\lib\__future__.py m __main__ a.py m _abcoll %PYTHON_INSTALL_DIR%\lib\_abcoll.py m _codecs m _collections m _functools m _hashlib %PYTHON_INSTALL_DIR%\DLLs\_hashlib.pyd m _heapq m _io m _locale m _random m _sre m _struct m _subprocess m _threading_local %PYTHON_INSTALL_DIR%\lib\_threading_local.py m _warnings m _weakref m _weakrefset %PYTHON_INSTALL_DIR%\lib\_weakrefset.py m abc %PYTHON_INSTALL_DIR%\lib\abc.py m array m atexit %PYTHON_INSTALL_DIR%\lib\atexit.py m bdb %PYTHON_INSTALL_DIR%\lib\bdb.py m binascii m cPickle m cStringIO m cmd %PYTHON_INSTALL_DIR%\lib\cmd.py m codecs %PYTHON_INSTALL_DIR%\lib\codecs.py m collections %PYTHON_INSTALL_DIR%\lib\collections.py m copy %PYTHON_INSTALL_DIR%\lib\copy.py m copy_reg %PYTHON_INSTALL_DIR%\lib\copy_reg.py m difflib %PYTHON_INSTALL_DIR%\lib\difflib.py m dis %PYTHON_INSTALL_DIR%\lib\dis.py m doctest %PYTHON_INSTALL_DIR%\lib\doctest.py m dummy_thread %PYTHON_INSTALL_DIR%\lib\dummy_thread.py P encodings %PYTHON_INSTALL_DIR%\lib\encodings\__init__.py m encodings.aliases %PYTHON_INSTALL_DIR%\lib\encodings\aliases.py m errno m exceptions m fnmatch %PYTHON_INSTALL_DIR%\lib\fnmatch.py m functools %PYTHON_INSTALL_DIR%\lib\functools.py m gc m genericpath %PYTHON_INSTALL_DIR%\lib\genericpath.py m getopt %PYTHON_INSTALL_DIR%\lib\getopt.py m gettext %PYTHON_INSTALL_DIR%\lib\gettext.py m hashlib %PYTHON_INSTALL_DIR%\lib\hashlib.py m heapq %PYTHON_INSTALL_DIR%\lib\heapq.py m imp m inspect %PYTHON_INSTALL_DIR%\lib\inspect.py m io %PYTHON_INSTALL_DIR%\lib\io.py m itertools m keyword %PYTHON_INSTALL_DIR%\lib\keyword.py m linecache %PYTHON_INSTALL_DIR%\lib\linecache.py m locale %PYTHON_INSTALL_DIR%\lib\locale.py P logging %PYTHON_INSTALL_DIR%\lib\logging\__init__.py m marshal m math m msvcrt m nt m ntpath %PYTHON_INSTALL_DIR%\lib\ntpath.py m opcode %PYTHON_INSTALL_DIR%\lib\opcode.py m operator m optparse %PYTHON_INSTALL_DIR%\lib\optparse.py m os %PYTHON_INSTALL_DIR%\lib\os.py m os2emxpath %PYTHON_INSTALL_DIR%\lib\os2emxpath.py m pdb %PYTHON_INSTALL_DIR%\lib\pdb.py m pickle %PYTHON_INSTALL_DIR%\lib\pickle.py m posixpath %PYTHON_INSTALL_DIR%\lib\posixpath.py m pprint %PYTHON_INSTALL_DIR%\lib\pprint.py m random %PYTHON_INSTALL_DIR%\lib\random.py m re %PYTHON_INSTALL_DIR%\lib\re.py m repr %PYTHON_INSTALL_DIR%\lib\repr.py m select %PYTHON_INSTALL_DIR%\DLLs\select.pyd m shlex %PYTHON_INSTALL_DIR%\lib\shlex.py m signal m sre_compile %PYTHON_INSTALL_DIR%\lib\sre_compile.py m sre_constants %PYTHON_INSTALL_DIR%\lib\sre_constants.py m sre_parse %PYTHON_INSTALL_DIR%\lib\sre_parse.py m stat %PYTHON_INSTALL_DIR%\lib\stat.py m string %PYTHON_INSTALL_DIR%\lib\string.py m strop m struct %PYTHON_INSTALL_DIR%\lib\struct.py m subprocess %PYTHON_INSTALL_DIR%\lib\subprocess.py m sys m tempfile %PYTHON_INSTALL_DIR%\lib\tempfile.py m textwrap %PYTHON_INSTALL_DIR%\lib\textwrap.py m thread m threading %PYTHON_INSTALL_DIR%\lib\threading.py m time m token %PYTHON_INSTALL_DIR%\lib\token.py m tokenize %PYTHON_INSTALL_DIR%\lib\tokenize.py m traceback %PYTHON_INSTALL_DIR%\lib\traceback.py m types %PYTHON_INSTALL_DIR%\lib\types.py P unittest %PYTHON_INSTALL_DIR%\lib\unittest\__init__.py m unittest.case %PYTHON_INSTALL_DIR%\lib\unittest\case.py m unittest.loader %PYTHON_INSTALL_DIR%\lib\unittest\loader.py m unittest.main %PYTHON_INSTALL_DIR%\lib\unittest\main.py m unittest.result %PYTHON_INSTALL_DIR%\lib\unittest\result.py m unittest.runner %PYTHON_INSTALL_DIR%\lib\unittest\runner.py m unittest.signals %PYTHON_INSTALL_DIR%\lib\unittest\signals.py m unittest.suite %PYTHON_INSTALL_DIR%\lib\unittest\suite.py m unittest.util %PYTHON_INSTALL_DIR%\lib\unittest\util.py m warnings %PYTHON_INSTALL_DIR%\lib\warnings.py m weakref %PYTHON_INSTALL_DIR%\lib\weakref.py Missing modules: ? _emx_link imported from os ? ce imported from os ? fcntl imported from subprocess, tempfile ? org.python.core imported from copy, pickle ? os.path imported from os, shlex ? os2 imported from os ? posix imported from os ? pwd imported from posixpath ? readline imported from cmd, pdb ? riscos imported from os ? riscosenviron imported from os ? riscospath imported from os 

正如你所看到的,是一个非常大量的模块(我修改了输出一点点,而不是实际的路径我放在%PYTHON_INSTALL_DIR%的环境变量)。 为了使Python代码的工作,你必须包括所有在安装这些模块/包。

modulefinder的输出注意 (而玩它,我已经注意到了):

  • 它搜索模块递归,所以这里是整个模块依赖关系树
  • 它搜索位于功能import语句(所以,不仅是那些在模块级)
  • 搜索动态导入 S(如[Python的2]:__import__( 名称[,全局[,当地人[,fromlist里[,级别]]]])

所以,看由操作系统所需要的模块,我不知道,服用了从C 站点导入使多大的差别。

重要提示 :为了确保您的.exe工程的任何计算机上,你可能会考虑包括VStudio C运行时库 (msvcr ##(#)DLL: [MS.Docs]:运行时库参考 )(其中#s为占位符对于数字-代表VStudio版本)在您的安装。



文章来源: What files are required for Py_Initialize to run?