Übergeben einer Liste durch Python an C ++

8

Ich habe also ein Python-Programm, das .txt-Dateiverzeichnisse findet und dann diese Verzeichnisse als Liste (glaube ich) an mein C ++ - Programm weiterleitet. Das Problem, das ich habe, ist, dass ich nicht sicher bin, wie man die Liste zu C ++ richtig übergibt. Ich habe verwendet:

%Vor%

wobei file_list der [] der txt-Dateiverzeichnisse ist.

Meine Argumente, die mein C ++ - Code akzeptiert, sind:

%Vor%

Ist das korrekt oder soll ich einen Vektor verwenden? Wenn ich das als mein Argument benutze und versuche, die Liste auszudrucken, bekomme ich das Verzeichnis meiner ausführbaren Datei, die Liste und dann die Smiley-Gesichter, Symbole und dann stürzt das Programm ab.

Irgendwelche Vorschläge? Mein Hauptpunkt, den ich herausfinden möchte, ist die richtige Syntax für die Verwendung von subprocess.call. Jede Hilfe wäre willkommen! Danke!

    
jnorris4118 18.07.2014, 17:16
quelle

4 Antworten

3

Ich werde diese alternative Lösung veröffentlichen, da sie auch für andere lange Listen von Strings funktioniert, die übergeben werden müssen.

Erstellen Sie in Ihrem Python script eine Textdatei (ich nenne sie "masterFile") und schreiben Sie die Dateipfade in die masterFile. Sie könnten jedem Dateipfad eine separate Zeile geben. Übergeben Sie dann den Dateipfad des MasterFile an Ihr Programm C++ . Auf diese Weise müssen Sie sich keine Gedanken über die Länge Ihrer Befehlszeilenargumente machen. Lassen Sie Ihr Programm C++ öffnen und lesen Sie die Datei zur Verarbeitung.

Sie können etwas wie os.remove() verwenden, um die Masterdatei in Ihrem Python -Skript zu entfernen, sobald das C++ -Programm beendet ist.

Sie haben auch in den Kommentaren erwähnt, dass Sie verschiedene Aufgaben abhängig von verschiedenen Dateipfaden ausführen müssen: Ein Vorschlag wäre, am Anfang jeder Zeile in der Masterdatei ein Zeichen hinzuzufügen, um zu signalisieren, was für das jeweilige zu tun ist Datei. Beispiel:

%Vor%     
Andrew_CS 18.07.2014, 17:47
quelle
2

Eine andere Option ist die Verwendung von cython (keine direkte Antwort). Hier ist ein einfaches vollständiges Beispiel:

Angenommen, Sie haben die folgenden Dateien:

cython_datei.cpp python_file.py setup.py sum_my_vector.cpp sum_my_vector.h

setup.py

%Vor%

cython_file.pyx

%Vor%

sum_my_vector.cpp

%Vor%

sum_my_vector.h

%Vor%

python_file.py

%Vor%

Führe jetzt

aus

python setup.py build_ext --inplace

und die Sie können die Python-Datei

ausführen %Vor%     
Akavall 19.07.2014 02:02
quelle
1

Sie übergeben eine Liste an subprocess.call . subprocess.call konvertiert dies in das, was für das System benötigt wird (was variieren kann, aber sicherlich keine Python-Liste ist). Das System veranlasst dann, dass dieses irgendwo in den neuen Prozess kopiert wird, und richtet die Standardargumente auf main ein, die int, char** sind. In Ihrem C ++ - Programm müssen Sie main als int main( int argc, char** argv ) ; nichts anderes wird funktionieren. (Zumindest ... ein System könnte int main( std::string const& ) oder etwas wie eine Erweiterung unterstützen. Aber ich habe noch nie von einem gehört, der das getan hat.)

    
James Kanze 18.07.2014 17:57
quelle
1
  

"Übergeben einer Liste durch Python an C ++"

Ein alternativer Ansatz wäre die Verwendung von Boost.Python < Dies kann Ihre Frage nicht direkt beantworten, aber es lohnt sich, auf eine andere Lösung hinzuweisen.

%Vor%

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

Verwendung:

%Vor%

Live Demo Here

    
P0W 18.07.2014 18:32
quelle

Tags und Links