2014-07-18 15 views
8

Quindi ho un programma Python che trova le directory di file .txt e poi passa quelle directory come una lista (credo) al mio programma C++. Il problema che sto avendo è che non sono sicuro di come passare la lista al C++ correttamente. Ho usato:Passare una lista attraverso Python a C++

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

dove file_list è la [] di directory di file txt.

mie argomentazioni che il mio codice C++ accetta sono:

int main (int argc, string argv[]) 

È questo corretto o dovrei usare un vettore? Quando uso questo come argomento e provo a stampare la lista, ottengo la directory del mio eseguibile, la lista, e poi faccine sorridenti, simboli e poi il programma si blocca.

Qualche suggerimento? Il mio punto principale che sto cercando di scoprire è la sintassi corretta dell'utilizzo di subprocess.call. Qualsiasi aiuto sarebbe apprezzato! Grazie!

+1

Grazie per l'aiuto modifica roba Ashoka ... Questo è il mio primo post in assoluto. – jnorris4118

+5

Non so come rispondere alla tua domanda sul passaggio dell'elenco - tuttavia, un'opzione alternativa se non riesci a farlo funzionare sarebbe quella di scrivere i percorsi dei file in un file temporaneo e quindi passare il percorso del file temporaneo al tuo Programma C++ come stringa. –

+0

Questa è una soluzione piuttosto semplice, ma sto cercando di tenerlo più contenuto in modo da non avere file di testo in giro ... Esiste un modo per eliminare quel file temporaneo in python dopo aver finito di utilizzarlo in python? – jnorris4118

risposta

3

Inserirò questa soluzione alternativa poiché funzionerebbe anche per altri lunghi elenchi di stringhe che dovevano essere superate.

Nello script Python creare un file di testo (lo chiamerò "masterFile") e scrivere i percorsi del file nel file master. È possibile assegnare a ciascun percorso del file una riga separata. Quindi passare il percorso del file masterfile al programma C++. In questo modo non devi preoccuparti della lunghezza degli argomenti della riga di comando. Lascia il tuo programma C++ aperto e leggi il file per l'elaborazione.

È possibile utilizzare qualcosa come os.remove() per sbarazzarsi del file master nello script Python una volta completato il programma C++.

Inoltre, hai menzionato nei commenti che devi svolgere compiti diversi a seconda dei diversi percorsi di file: un suggerimento sarebbe aggiungere un carattere all'inizio di ogni riga nel file master per segnalare cosa deve essere fatto per file particolare. Esempio:

a Random/path/aFile.txt # a could mean do task 1 
b Random2/path2/differentFile.C# b could mean do task 2 
+0

Grazie. Penso che sia quello che finirò per fare. (Sembra essere meno di un mal di testa) Apprezzo che tu abbia il tempo di rispondere a questo. Inoltre, non posso votare la tua risposta perché ho cinque reputazione di distanza ... Se tu potessi invogliare il mio, potrei revocare il tuo heh. – jnorris4118

+2

@ jnorris4118 In questo caso dovresti contrassegnare la risposta di Andrew come corretta in modo che questa domanda sia "risolta". – RevanProdigalKnight

+0

Scusa ... ho appena scoperto ... heh – jnorris4118

1

Si passa una lista a subprocess.call. subprocess.call lo converte in ciò che è necessario per il sistema (che può variare, ma certamente non è un elenco Python). Il sistema quindi provvede affinché questo venga copiato da qualche parte nel nuovo processo e imposta gli argomenti standard su main, che sono int, char**. Nel tuo programma C++, devi definire main come int main(int argc, char** argv); nient'altro funzionerà. (Almeno ... un sistema potrebbe sostenere int main(std::string const&) o qualcosa del genere come estensione. Ma non ho mai sentito parlare di uno che ha fatto.)

1

"Passando attraverso una lista Python per C++"

Un approccio alternativo sarebbe quello di utilizzare Boost.Python, questo potrebbe non rispondere direttamente alla tua domanda, ma vale comunque la pena indicare un'altra soluzione.

#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); 
} 

compilato utilizzando: g++ main.cpp -shared -fPIC -o get_dir_list.so -I/usr/include/python2.7 -lboost_python


Usage:

import get_dir_list 
import os 
get_dir_list.get_dir_list(os.listdir('.')) 

Live Demo Here

2

Un'altra opzione è usare cython, (non una risposta diretta). Ecco un semplice esempio completo:

Supponiamo di avere i seguenti file:

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]) 

Ora gestiscono

python setup.py build_ext --inplace

e la si può eseguire il file python

python python_file.py 
11 
Problemi correlati