Py_Initialize运行需要哪些文件?

Py_Initialize运行需要哪些文件?,第1张

Py_Initialize运行需要哪些文件?

在开始的时候,我想说的话,有没有需要的模块(至少没有 非内置 之一) Py_InitializeEx ,所以是唯一的要求
python27.dll (顺便说一句: python27.lib不是* 必须的,除非你的同事要链接的东西反对它-但要使用
PythonInclude dir并不是一件容易的事。我有以下代码顺便说一句 :我正在使用通过 VStudio _ 10_( 2010 )构建的 Python 2.7.10 ): _
*_ __

#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: %dnPress a key to exit...n", i);    _getch();    return 0;}

它运行良好,可以从 VStudio 和命令行运行(将 .dll 复制到其文件夹中)。但是后来我将 .exe.dll
复制到另一台计算机上,当运行时, 砰!

importError: No module named site

考虑到:

  • 我在运行 .exe 的两台计算机上的两个控制台中都没有设置 PYTHON * env vars (结果不同) __
  • 在两台机器上, Python 安装都在同一路径上(我以前(几年前)在无法运行的机器上对其进行了修改)

我不知道为什么它的行为不一样(我没有检查过的一件事是机器上可能存在某些注册表项可以工作?)。

注意站点 是( .py(c) )模块,位于 %PYTHON_INSTALL_DIR% Lib下

然后,我浏览了 Python 的源代码,然后遇到了这个(文件: pythonrun.c ,行: 269 ,函数
Py_InitializeEx pythonrun.c:269:Py_InitializeEx- 这就是我要引用源中的点的方式码):

    if (!Py_NoSiteFlag)        initsite(); 

而在 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: %dnPress a key to exit...n", i);    _getch();    return 0;}

而且有效!好极了!

因此,在这一点上只需要 .dll 即可运行一段代码。但是我想您的代码要比它复杂一点(它具有 import s([Python
2.Docs]:import语句)。要解决 导入
问题,可以使用以下漂亮的模块:[Python 2 .docs]:modulefinder-
查找脚本使用的模块( Python 2.7 的标准模块的一部分)。

  • 将您从 C 执行的代码保存在 .py 文件中
  • 对它运行 modulefinder

这是我的代码的示例(我的 C 程序中的 pyCode 内容,保存在文件中)。 __

pre.py

s = "abc"print s, 1234

运行:

%PYTHON_INSTALL_DIR%python -m modulefinder pre.py

产量:

NameFile--------m __main__     pre.py

但是 ,如果我

import os
在文件中添加一个(这是一个非常常见的模块)语句,则上面的命令将产生:

Name  File----  ----m StringIO       %PYTHON_INSTALL_DIR%libStringIO.pym UserDict       %PYTHON_INSTALL_DIR%libUserDict.pym __builtin__m __future__     %PYTHON_INSTALL_DIR%lib__future__.pym __main__       a.pym _abcoll        %PYTHON_INSTALL_DIR%lib_abcoll.pym _precsm _collectionsm _functoolsm _hashlib       %PYTHON_INSTALL_DIR%DLLs_hashlib.pydm _heapqm _iom _localem _randomm _srem _structm _subprocessm _threading_local          %PYTHON_INSTALL_DIR%lib_threading_local.pym _warningsm _weakrefm _weakrefset    %PYTHON_INSTALL_DIR%lib_weakrefset.pym abc %PYTHON_INSTALL_DIR%libabc.pym arraym atexit         %PYTHON_INSTALL_DIR%libatexit.pym bdb %PYTHON_INSTALL_DIR%libbdb.pym binasciim cPicklem cStringIOm cmd %PYTHON_INSTALL_DIR%libcmd.pym precs         %PYTHON_INSTALL_DIR%libprecs.pym collections    %PYTHON_INSTALL_DIR%libcollections.pym copy%PYTHON_INSTALL_DIR%libcopy.pym copy_reg       %PYTHON_INSTALL_DIR%libcopy_reg.pym difflib        %PYTHON_INSTALL_DIR%libdifflib.pym dis %PYTHON_INSTALL_DIR%libdis.pym doctest        %PYTHON_INSTALL_DIR%libdoctest.pym dummy_thread   %PYTHON_INSTALL_DIR%libdummy_thread.pyP encodings

%PYTHON_INSTALL_DIR%libencodings__init__.py
m encodings.aliases
%PYTHON_INSTALL_DIR%libencodingsaliases.py
m errno
m exceptions
m fnmatch %PYTHON_INSTALL_DIR%libfnmatch.py
m functools %PYTHON_INSTALL_DIR%libfunctools.py
m gc
m genericpath %PYTHON_INSTALL_DIR%libgenericpath.py
m getopt %PYTHON_INSTALL_DIR%libgetopt.py
m gettext %PYTHON_INSTALL_DIR%libgettext.py
m hashlib %PYTHON_INSTALL_DIR%libhashlib.py
m heapq %PYTHON_INSTALL_DIR%libheapq.py
m imp
m inspect %PYTHON_INSTALL_DIR%libinspect.py
m io %PYTHON_INSTALL_DIR%libio.py
m itertools
m keyword %PYTHON_INSTALL_DIR%libkeyword.py
m linecache %PYTHON_INSTALL_DIR%liblinecache.py
m locale %PYTHON_INSTALL_DIR%liblocale.py
P logging %PYTHON_INSTALL_DIR%liblogging__init__.py
m marshal
m math
m msvcrt
m nt
m ntpath %PYTHON_INSTALL_DIR%libntpath.py
m oppre %PYTHON_INSTALL_DIR%liboppre.py
m operator
m optparse %PYTHON_INSTALL_DIR%liboptparse.py
m os %PYTHON_INSTALL_DIR%libos.py
m os2emxpath %PYTHON_INSTALL_DIR%libos2emxpath.py
m pdb %PYTHON_INSTALL_DIR%libpdb.py
m pickle %PYTHON_INSTALL_DIR%libpickle.py
m posixpath %PYTHON_INSTALL_DIR%libposixpath.py
m pprint %PYTHON_INSTALL_DIR%libpprint.py
m random %PYTHON_INSTALL_DIR%librandom.py
m re %PYTHON_INSTALL_DIR%libre.py
m repr%PYTHON_INSTALL_DIR%librepr.py
m select %PYTHON_INSTALL_DIR%DLLsselect.pyd
m shlex %PYTHON_INSTALL_DIR%libshlex.py
m signal
m sre_compile %PYTHON_INSTALL_DIR%libsre_compile.py
m sre_constants %PYTHON_INSTALL_DIR%libsre_constants.py
m sre_parse %PYTHON_INSTALL_DIR%libsre_parse.py
m stat%PYTHON_INSTALL_DIR%libstat.py
m string %PYTHON_INSTALL_DIR%libstring.py
m strop
m struct %PYTHON_INSTALL_DIR%libstruct.py
m subprocess %PYTHON_INSTALL_DIR%libsubprocess.py
m sys
m tempfile %PYTHON_INSTALL_DIR%libtempfile.py
m textwrap %PYTHON_INSTALL_DIR%libtextwrap.py
m thread
m threading %PYTHON_INSTALL_DIR%libthreading.py
m time
m token %PYTHON_INSTALL_DIR%libtoken.py
m tokenize %PYTHON_INSTALL_DIR%libtokenize.py
m traceback %PYTHON_INSTALL_DIR%libtraceback.py
m types %PYTHON_INSTALL_DIR%libtypes.py
P unittest
%PYTHON_INSTALL_DIR%libunittest__init__.py
m unittest.case %PYTHON_INSTALL_DIR%libunittestcase.py
m unittest.loader%PYTHON_INSTALL_DIR%libunittestloader.py
m unittest.main %PYTHON_INSTALL_DIR%libunittestmain.py
m unittest.result%PYTHON_INSTALL_DIR%libunittestresult.py
m unittest.runner%PYTHON_INSTALL_DIR%libunittestrunner.py
m unittest.signals %PYTHON_INSTALL_DIR%libunittestsignals.py
m unittest.suite %PYTHON_INSTALL_DIR%libunittestsuite.py
m unittest.util %PYTHON_INSTALL_DIR%libunittestutil.py
m warnings %PYTHON_INSTALL_DIR%libwarnings.py
m weakref %PYTHON_INSTALL_DIR%libweakref.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% env var的实际路径)。为了使 Python
代码正常工作,您必须在安装程序中包括所有这些模块/软件包。

*关于 modulefinder 的输出的 *注释 (在使用它时我已经注意到):

  • 它以递归方式搜索模块,因此这是整个模块依赖关系树
  • 它搜索位于函数中的 导入 语句(因此,不仅限于模块级别的 导入 语句)
  • 搜索动态 import (例如[Python 2.Docs]: importname [,globals [,locals [,fromlist [,level]]]] ))

因此,查看 os 所需的模块,我不确定从 C中 取出 站点 导入是否有很大的区别。 __

重要提示 :为了确保您的 .exe文件 的任何计算机上的作品,你可能会考虑包括 VStudio C运行时库VCRTLib
msvcr ##(#)DLL。
:[MS.Docs]:运行时库参考)(其中
小号是安装程序中数字的占位符-表示 VStudio 版本)。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5644105.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存