假设一个 Python 程序,内部有一个子线程。那么 C++调用该程序时,子线程不会自动运行。只有 C++在调用 Python 程序时,该子线程才会随之运行一小段时间。
示例 Python 程序 test_python_thread.py
如下,调用的 c++代码test_python_thread.cpp
附在后面。编译后直接运行./test_python_thread
无输出,输入xxx
后输出十个数字后停止。但按道理,python 代码应该会每秒钟输出一个数字。
我想知道怎么才能让 Python 里面的子线程能够不间断运行(每秒钟输出 1 个数字)?
#!/usr/bin/env python
# encoding: utf-8
import thread, time
class PyTest:
def __init__(self):
def local_python_thread(s):
while True:
print "local_python_thread", s
s += 1
time.sleep(1)
thread.start_new_thread(local_python_thread, (0, ))
def xxx(self):
s = 0
while s < 10:
print "cpp_thread", s
s += 1
time.sleep(1)
示例 C++程序 (test_python_thread.cpp
)
#include <python2.7/Python.h>
#include <boost/python.hpp>
#include <boost/filesystem.hpp>
#include <iostream>
#include <thread>
namespace bp = boost::python;
class CppTest
{
private:
bp::object python_module;
bp::object python_class;
bp::object python_object;
bp::object python_xxx;
public:
CppTest()
{
Py_Initialize(); // 初始化
PyRun_SimpleString("import sys");
boost::filesystem::path path = "./test_python_thread.py";
std::string chdir_cmd = std::string("sys.path.append(\"") + path.parent_path().c_str() + "\")";
PyRun_SimpleString("sys.path.append('./')");
PyRun_SimpleString(chdir_cmd.c_str());
python_module = bp::import(path.stem().c_str());
python_class = python_module.attr("PyTest");
python_object = python_class();
python_xxx = python_object.attr("xxx");
}
virtual void xxx()
{
python_xxx();
}
};
int main()
{
CppTest test{};
std::string cmd;
while (true) {
std::getline(std::cin, cmd);
if (cmd == "xxx") {
test.xxx();
}
}
return 0;
}
编译 cpp(需要 boost 库):
g++ -std=c++0x -o test_python_thread test_python_thread.cpp -lboost_system -l boost_filesystem -l python2.7 -g -I /usr/include/python2.7/ -l boost_python
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.