[英]Passing a list through Python to C++
所以我有一個Python程序,它找到.txt文件目錄,然后將這些目錄作為列表(我相信)傳遞給我的C ++程序。 我遇到的問題是我不確定如何正確地將列表傳遞給C ++。 我用過 :
subprocess.call(["path for C++ executable"] + file_list)
其中file_list
是txt文件目錄的[]
。
我的C ++代碼接受的論點是:
int main (int argc, string argv[])
這是正確的還是我應該使用矢量? 當我使用它作為我的參數並嘗試打印出列表時,我得到了我的可執行文件的目錄,列表,然后是笑臉,符號,然后程序崩潰。
有什么建議? 我試圖找出的主要觀點是利用subprocess.call的正確語法。 任何幫助,將不勝感激! 謝謝!
我將發布這個替代解決方案,因為它也適用於需要傳遞的其他長字符串列表。
在Python
腳本中創建一個文本文件(我稱之為“masterFile”)並將文件路徑寫入masterFile。 您可以為每個文件路徑分別設置一行。 然后將masterFile的文件路徑傳遞給您的C++
程序。 這樣您就不必擔心命令行參數的長度。 讓您的C++
程序打開並讀取文件以進行處理。
一旦C++
程序完成,您可以使用類似os.remove()
東西來刪除Python
腳本中的os.remove()
。
另外,您在評論中提到需要根據不同的文件路徑執行不同的任務:建議在masterFile的每行開頭添加一個char來表示需要對特定文件執行的操作。 例:
a Random/path/aFile.txt # a could mean do task 1
b Random2/path2/differentFile.c # b could mean do task 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
“將列表通過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('.'))
您將列表傳遞給subprocess.call
。 subprocess.call
將其轉換為系統所需的內容(可能會有所不同,但肯定不是Python列表)。 系統然后安排在新進程中的某處復制它,並設置main
的標准參數,即int, char**
。 在C ++程序中,必須將main
定義為int main( int argc, char** argv )
; 沒有別的辦法。 (至少......系統可以支持int main( std::string const& )
或者某些擴展等。但我從來沒有聽說過那個。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.