SPOILER:部分解决(见最后).
以下是使用Python嵌入的代码示例:
#include <Python.h>
int main(int argc, char** argv)
{
Py_SetPythonHome(argv[1]);
Py_Initialize();
PyRun_SimpleString("print \"Hello !\"");
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用gcc 4.8.5在Linux openSUSE 42.2下工作(但我在使用gcc 4.8.3的openSUSE 13.2或使用gcc 4.4.7的RedHat 6.4时也遇到了同样的问题).
我编译了Python 2.7.9的静态和动态版本(但我在Python 2.7.13中也遇到了同样的问题).
我使用以下命令编译链接到Python静态版本的示例:
g++ hello.cpp -o hello \
-I /home/caduchon/softs/python/2.7.9/64/gcc/4.8.5/static/include/python2.7 \
-L /home/caduchon/softs/python/2.7.9/64/gcc/4.8.5/static/lib \
-l python2.7 -l pthread -l util -l dl
Run Code Online (Sandbox Code Playgroud)
如果我在参数中使用静态版本的Python执行我的示例,它就可以工作.
如果我在参数的动态版本的Python上执行它,我会收到以下错误(它发生在Py_Initialize()):
> ./hello /home/caduchon/softs/python/2.7.9/64/gcc/4.8.5/dynamic
Fatal Python error: PyThreadState_Get: no current thread
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它适用于静态版本,它不适用于动态版本.我该如何解决这类问题?
编辑:我安装Python的脚本如下:
#!/bin/bash
WORKDIR=/home/caduchon/tmp/install_python_2_7_13
ARCHIVEDIR=/home/caduchon/downloads/python
PYTHON_VERSION='2.7.13'
EZ_SETUP_VERSION='0.9'
SETUPTOOLS_VERSION='34.1.0'
CYTHON_VERSION='0.25.2'
NUMPY_VERSION='1.12.0'
SCIPY_VERSION='0.18.1' …Run Code Online (Sandbox Code Playgroud) 从文档中:
嵌入式发行版是一个包含最小Python环境的ZIP文件。
听起来不错!Python的64位Windows嵌入式v3.6.5仅13MB。作为编译的替代方法,我想将一些python脚本以及在未安装Python的Win10机器上运行它们所需的最低要求一起压缩。
现在,我几乎总是需要导入其他软件包来提供功能。但是,如果我想与该嵌入式版本的Python一起发送python脚本,就无法确定该怎么做。例如,如果我的脚本使用numpy,如何在“嵌入”中包含该库?即,这样我就可以在任何Win10机器上解压缩单个部署文件并立即执行我的脚本吗?
(通常pip install numpy会创建一个超过50MB的Lib子目录!但是对于“嵌入式”部署,我不需要任何调试支持,也不需要大量文件中包含的任何其他内容。)
我曾经读过关于最小的python安装,没有很多python默认安装附带的库但是在网上找不到它...
我想要做的只是打包一个脚本,其中包含执行它并使其可移植所需的python内容.
有没有人知道这样的事情?
谢谢
我的朋友刚开始学习 Python 和 Flask,并且缺少很多“最佳实践”,例如requirements.txt文件。
他最近向我寻求帮助,为了使项目干净,我想设置一个 CI 服务(Travis),但我需要先制定这个文件。
由于他最初没有requirements.txt,所以我能得到的所有信息都是他的import陈述,以及他的输出pip freeze。
由于无法区分项目的直接需求和其中一个包的间接需求,我想从列表中找出所有“顶级”包。“顶级包”是列表中另一个包不需要的包。例如,urllib3is required by requests,所以当requests存在时,urllib3最好不要出现在最终结果中。
有没有办法实现这一目标?
如果有人想帮助我解决这个特定的实例,这里是输出pip freeze:
apturl==0.5.2
arrow==0.12.1
asn1crypto==0.24.0
binaryornot==0.4.4
blinker==1.4
Bootstrap-Flask==1.0.9
Brlapi==0.6.6
certifi==2018.1.18
chardet==3.0.4
Click==7.0
colorama==0.3.7
command-not-found==0.3
configparser==3.5.0
cookiecutter==1.6.0
cryptography==2.1.4
cupshelpers==1.0
decorator==4.1.2
defer==1.0.6
distro-info==0.18
dominate==2.3.5
Flask==1.0.2
Flask-Bootstrap4==4.0.2
Flask-Login==0.4.1
Flask-Mail==0.9.1
Flask-Moment==0.6.0
Flask-SQLAlchemy==2.3.2
Flask-WTF==0.14.2
future==0.17.1
httpie==0.9.8
httplib2==0.9.2
idna==2.6
ipython==5.5.0
ipython-genutils==0.2.0
itsdangerous==1.1.0
Jinja2==2.10
jinja2-time==0.2.0
keyring==10.6.0
keyrings.alt==3.0
language-selector==0.1
launchpadlib==1.10.6
lazr.restfulclient==0.13.5
lazr.uri==1.0.3
louis==3.5.0
macaroonbakery==1.1.3
Mako==1.0.7
MarkupSafe==1.1.0
mysqlclient==1.3.14 …Run Code Online (Sandbox Code Playgroud) 我需要在 Windows 平台下从我的 C++ 项目中调用实现为 Python (3.6) 函数的管道。来自文件“ experiment_test.py ”的函数“ function_name ”将文本字符串作为输入参数,并返回另一个文本字符串作为结果。我尝试了下面的代码,但它不能正常工作 - 库shutil、codecs、makedirs等中的python 函数不起作用。
C++ 代码(减少):
std::string Text,Result;
PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
Py_Initialize();
pName = PyUnicode_FromString("experiment_test");
pModule = PyImport_Import(pName);
pDict = PyModule_GetDict(pModule);
pFunc = PyDict_GetItemString(pDict, "function_name");
pArgs = PyTuple_New(1);
pValue = PyUnicode_FromString(Text.c_str());
PyTuple_SetItem(pArgs, 0, pValue);
if (PyCallable_Check(pFunc))
{
pValue = PyObject_CallObject(pFunc, pArgs);
if (pValue != NULL)
{
Result = PyUnicode_AsUTF8(pValue);
Py_DECREF(pValue);
}
else return false;
}
// ...
Py_Finalize();
Run Code Online (Sandbox Code Playgroud)
Python代码(减少): …
我有一个C ++程序,需要对用Python编写的库进行某些调用。(而不是用C ++重写整个库...)
最简单的方法是什么?我需要将2个数字传递到库中,并取回2个数字。
我需要它可移植并且可以在Windows和Linux中运行,因此例如不可能使用POSIX popen。
到目前为止,我最好的解决方案是编写一个python包装程序,由C ++代码中的“系统”调用来调用,该程序使用命令行参数,调用该函数,并将结果写入文件,然后由文件打开。 C ++程序。
如果您知道更好的话,请告诉我...