Так что у меня есть программа на 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++
Программа откроет и прочитает файл для обработки.
Вы можете использовать что-то вроде 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
Другой вариант заключается в использовании 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
Вы передаете список subprocess.call
, subprocess.call
преобразует это в то, что необходимо для системы (которая может варьироваться, но, конечно, не является списком Python). Затем система организует его копирование в новый процесс и устанавливает стандартные аргументы для main
, которые int, char**
, В вашей программе на C ++ вы должны определить main
как int main( int argc, char** argv )
; больше ничего не будет работать. (По крайней мере … система может поддерживать int main( std::string const& )
или некоторые, такие как расширение. Но я никогда не слышал о том, что сделал.)
«Передача списка через 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('.'))