所以我有一个Python程序,它找到.txt文件目录,然后将这些目录作为列表(我相信)传递给我的C ++程序。我遇到的问题是我不确定如何正确地将列表传递给C ++。我用过:
subprocess.call(["path for C++ executable"] + file_list)
其中file_list
是txt文件目录的[]
。
我的C ++代码接受的论点是:
int main (int argc, string argv[])
这是正确的还是我应该使用矢量?当我使用它作为我的参数并尝试打印出列表时,我得到可执行文件的目录,列表,然后是笑脸,符号,然后程序崩溃。
有什么建议吗?我试图找出的主要观点是利用subprocess.call的正确语法。任何帮助,将不胜感激!谢谢!
答案 0 :(得分:3)
我会发布这个替代解决方案,因为它也适用于需要传递的其他长字符串列表。
在Python
脚本中创建一个文本文件(我称之为“masterFile”)并将文件路径写入masterFile。您可以为每个文件路径分别设置一行。然后将masterFile的文件路径传递给C++
程序。这样您就不必担心命令行参数的长度。让您的C++
程序打开并阅读文件进行处理。
os.remove()
程序完成后,您可以使用Python
之类的内容删除C++
脚本中的masterFile。
另外,您在评论中提到需要根据不同的文件路径执行不同的任务:建议在masterFile的每一行的开头添加一个char来表示需要为特定的文件做什么文件。例如:
a Random/path/aFile.txt # a could mean do task 1
b Random2/path2/differentFile.c # b could mean do task 2
答案 1 :(得分:2)
“将列表通过Python传递给C ++”
另一种方法是使用Boost.Python
,这可能无法直接回答您的问题,但仍值得指出另一种解决方案。
#include <boost/python.hpp>
#include <vector>
#include <string>
void get_dir_list( boost::python::list dir_list )
{
for (int i = 0; i < len(dir_list); ++i)
{
std::string x = boost::python::extract<std::string>(dir_list[i]);
// perform stuffs
std::cout << "This is " << x << std::endl ;
}
}
BOOST_PYTHON_MODULE(get_dir_list)
{
def("get_dir_list", get_dir_list);
}
编译使用:
g++ main.cpp -shared -fPIC -o get_dir_list.so -I/usr/include/python2.7 -lboost_python
用法:
import get_dir_list
import os
get_dir_list.get_dir_list(os.listdir('.'))
答案 2 :(得分:2)
另一种选择是使用cython
,(不是直接回答)。这是一个简单的完整示例:
假设您有以下文件:
cython_file.cpp python_file.py setup.py sum_my_vector.cpp sum_my_vector.h
<强> setup.py 强>
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension(
name="cython_file",
sources=["cython_file.pyx", "sum_my_vector.cpp"],
extra_compile_args=["-std=c++11"],
language="c++",
)]
setup(
name = 'cython_file',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules,
)
<强> cython_file.pyx 强>
from libcpp.vector cimport vector
cdef extern from "sum_my_vector.h":
int sum_my_vector(vector[int] my_vector)
def sum_my_vector_cpp(my_list):
cdef vector[int] my_vector = my_list
return sum_my_vector(my_vector)
<强> sum_my_vector.cpp 强>
#include <iostream>
#include <vector>
#include "sum_my_vector.h"
using namespace::std;
int sum_my_vector(vector<int> my_vector)
{
int my_sum = 0;
for (auto iv = my_vector.begin(); iv != my_vector.end(); iv++)
my_sum += *iv;
return my_sum;
}
<强> sum_my_vector.h 强>
#ifndef SUM_MY_VECTOR
#define SUM_MY_VECTOR
using namespace::std;
int sum_my_vector(vector<int> my_vector);
#endif
<强> python_file.py 强>
from cython_file import sum_my_vector_cpp
print sum_my_vector_cpp([1,2,3,5])
现在运行
python setup.py build_ext --inplace
你可以运行python文件
python python_file.py
11
答案 3 :(得分:1)
您将列表传递给subprocess.call
。 subprocess.call
将此转换为系统所需的内容(可能会有所不同,但肯定不是Python列表)。然后,系统会安排将其复制到新流程的某个位置,并将main
的标准参数设置为int, char**
。在C ++程序中,您必须将main
定义为int main( int argc, char** argv )
;没有别的办法。 (至少......一个系统可以支持int main( std::string const& )
或某些扩展等。但是我从来没有听说过那个。{/ p>