簡體   English   中英

將列表通過Python傳遞給C ++

[英]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('.'))

Live Demo Here

您將列表傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM