jno*_*118 8 c++ python subprocess
所以我有一个Python程序,它找到.txt文件目录,然后将这些目录作为列表(我相信)传递给我的C++程序.我遇到的问题是我不确定如何正确地将列表传递给C++.我用过 :
subprocess.call(["path for C++ executable"] + file_list)
Run Code Online (Sandbox Code Playgroud)
这里file_list是[]txt文件的目录.
我的C++代码接受的论点是:
int main (int argc, string argv[])
Run Code Online (Sandbox Code Playgroud)
这是正确的还是我应该使用矢量?当我使用它作为我的参数并尝试打印出列表时,我得到了我的可执行文件的目录,列表,然后是笑脸,符号,然后程序崩溃.
有什么建议?我试图找出的主要观点是利用subprocess.call的正确语法.任何帮助,将不胜感激!谢谢!
另一种选择是使用cython, (不是直接答案)。这是一个简单的完整示例:
假设您有以下文件:
cython_file.cpp python_file.py setup.py sum_my_vector.cpp sum_my_vector.h
安装程序.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,
)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
sum_my_vector.h
#ifndef SUM_MY_VECTOR
#define SUM_MY_VECTOR
using namespace::std;
int sum_my_vector(vector<int> my_vector);
#endif
Run Code Online (Sandbox Code Playgroud)
python_file.py
from cython_file import sum_my_vector_cpp
print sum_my_vector_cpp([1,2,3,5])
Run Code Online (Sandbox Code Playgroud)
现在运行
python setup.py build_ext --inplace
然后你就可以运行 python 文件了
python python_file.py
11
Run Code Online (Sandbox Code Playgroud)
我将发布这个替代解决方案,因为它也适用于需要传递的其他长字符串列表。
在您的Python脚本中创建一个文本文件(我将其称为“masterFile”)并将文件路径写入 masterFile。您可以给每个文件路径单独的一行。然后将 masterFile 的文件路径传递给您的C++程序。这样您就不必担心命令行参数的长度。让您的C++程序打开并读取文件进行处理。
程序完成后,您可以使用类似的方法os.remove()删除脚本中的 masterFile 。PythonC++
另外,您在评论中提到,您需要根据不同的文件路径执行不同的任务:建议是在 masterFile 中每行的开头添加一个字符,以表示需要对特定文件执行哪些操作。例子:
a Random/path/aFile.txt # a could mean do task 1
b Random2/path2/differentFile.c # b could mean do task 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1840 次 |
| 最近记录: |