Передача списка через Python в переполнение стека

Так что у меня есть программа на Python, которая находит каталоги файлов .txt и затем передает эти каталоги в виде списка (я полагаю) в мою программу на C ++. У меня проблема в том, что я не уверен, как правильно передать список в C ++. Я использовал :

subprocess.call(["path for C++ executable"] + file_list)

где file_list это [] TXT файлов каталогов.

Мои аргументы, которые принимает мой код C ++:

 int main (int argc, string argv[])

Это правильно или я должен использовать вектор? Когда я использую это в качестве аргумента и пытаюсь распечатать список, я получаю каталог моего исполняемого файла, список, а затем смайлики, символы, а затем происходит сбой программы.

Какие-либо предложения? Главное, что я пытаюсь выяснить, — это правильный синтаксис использования subprocess.call. Любая помощь будет оценена! Спасибо!

8

Решение

Я опубликую это альтернативное решение, так как оно также будет работать для других длинных списков строк, которые необходимо передать.

В вашем Python скрипт создает текстовый файл (я назову его «masterFile») и записывает пути к файлу в masterFile. Вы можете указать каждому пути к файлу отдельную строку. Затем передайте путь к файлу masterFile вашему C++ программа. Таким образом, вам не нужно беспокоиться о длине аргументов командной строки. Пусть ваш C++ Программа откроет и прочитает файл для обработки.

Вы можете использовать что-то вроде os.remove() избавиться от masterFile в вашем Python сценарий раз C++ Программа завершена.

Кроме того, вы упомянули в комментариях, что вам нужно выполнять разные задачи, зависящие от разных путей к файлам: было бы предложено добавить символ в начале каждой строки в masterFile, чтобы указать, что нужно сделать для конкретного файла. Пример:

a Random/path/aFile.txt # a could mean do task 1
b Random2/path2/differentFile.c # b could mean do task 2
3

Другие решения

Другой вариант заключается в использовании 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
2

Вы передаете список subprocess.call, subprocess.call преобразует это в то, что необходимо для системы (которая может варьироваться, но, конечно, не является списком Python). Затем система организует его копирование в новый процесс и устанавливает стандартные аргументы для main, которые int, char**, В вашей программе на C ++ вы должны определить main как int main( int argc, char** argv ); больше ничего не будет работать. (По крайней мере … система может поддерживать int main( std::string const& ) или некоторые, такие как расширение. Но я никогда не слышал о том, что сделал.)

1

«Передача списка через 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

1
По вопросам рекламы [email protected]