8
votes

Passer une liste via Python à C ++

J'ai donc un programme Python qui trouve des annuaires de fichiers .txt, puis de transmettre ces annuaires comme une liste (je crois) à mon programme C ++. Le problème que j'ai, c'est que je ne suis pas sûr de passer la liste à C ++ correctement. J'ai utilisé: xxx pré>

file_list code> est le [] code> des répertoires de fichiers txt. P>

Mes arguments Mon code C ++ accepte les suivants: P>

 int main (int argc, string argv[])


9 commentaires

Merci d'avoir aidé à éditer Stuff Ashoka ... c'est mon premier post de tous les temps.


Je ne sais pas comment répondre à votre question sur la transmission de la liste - toutefois, une option alternative si vous ne pouvez pas le faire fonctionner serait d'écrire les chemins de fichiers dans un fichier temporaire, puis transmettez le chemin du fichier temporel à votre C ++. programme comme une chaîne.


C'est une solution assez facile, mais j'essaie de le garder plus contenue de sorte que je n'ai pas de fichiers texte flottant ... y a-t-il un moyen de supprimer ce fichier temporaire à Python après avoir fini de l'utiliser à Python?


Je ne sais pas d'utiliser sous-processus.Call (quelle est votre question), mais j'ai trouvé qu'utiliser Cyron pour quelque chose comme ceci est assez simple.


Vous devriez être capable de le supprimer dans votre python script ou C ++ , recherchez simplement la commande, devrait être assez simple.


Une partie de la question serait le nombre de fichiers que vous envisagez d'être envoyé à cette application? Vous devez également garder la longueur de la commande de ligne de commande à l'esprit. Cela doit également fonctionner dans un environnement Windows et que si le chemin du nom de fichier a une place dedans? Comment détermineriez-vous cet espace potentiel qui peut faire 1 chemin de fichier ressembler à 2 chemins de fichier différents?


Environ 150 fichiers, dans Windows EnvR, et j'ai besoin de l'espace entre chaque répertoire, car j'utilise chacun de chacun sur une base séparée via mon programme C ++


Ne devrait-il pas être int Main (int argc, char * argv []) ?


Je suis content que tu l'as apporté ça. Cela fait également partie de ma question. Si je passe dans une liste, comment cela équivaut-il à une liste dans Python? Est-ce juste un pointeur ou s'il devrait être une chaîne []? Si j'utilise la chaîne, je peux réellement voir une sortie, s'il s'agit d'un char * argv [] alors je ne peux pas.


4 Réponses :


3
votes

Je posterai cette solution alternative car elle fonctionnerait également pour d'autres listes longues de chaînes qui devaient être transmises.

dans votre script code> python code> Créez un fichier texte (je vais appeler Il "Masterfile") et écrivez les chemins de fichiers sur le fichier Masterfile. Vous pouvez donner à chaque chemin de fichier une ligne séparée. Passez ensuite le chemin de fichier du fichier Masterfile vers votre programme C ++ code>. De cette façon, vous n'avez pas à vous soucier de la longueur de vos arguments de ligne de commande. Laissez votre programme C ++ code> Ouvrir et lire le fichier de traitement. P>

Vous pouvez utiliser quelque chose comme os.remove () code> pour se débarrasser du fichier Masterfile Votre script python code> une fois que le programme C ++ code> est terminé. p>

En outre, vous avez mentionné dans les commentaires que vous devez effectuer différentes tâches dépendant de différents chemins de fichiers. : Une suggestion serait d'ajouter un caractère au début de chaque ligne dans le fichier Masterfile pour signaler ce qui doit être effectué pour le fichier particulier. Exemple: P>

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


3 commentaires

Merci. Je pense que c'est ce que je finirai par faire. (Semble être moins mal à la tête) J'apprécie que vous preniez le temps de répondre à cela. De plus, je ne peux pas voter votre réponse parce que je suis une réputation de cinq ans ... Si vous pouviez uppoter de la mienne, je pouvais uppouver le vôtre heh.


@ Jnorris4118 Dans ce cas, vous devez marquer la réponse de Andrew comme correcte afin que cette question soit "résolue".


Désolé ... je viens de découvrir ... heh



1
votes

Vous passez une liste à Subprocess.Call . Subprocess.Call Convertit ceci en ce qui est nécessaire pour le système (qui peut varier, mais il n'est certainement pas une liste de python). Le système organise ensuite cela pour que cela soit copié quelque part dans le nouveau processus et définit les arguments standard sur principal , qui sont int, char * ** . Dans votre programme C ++, vous devez définir principal comme int Main (int Argc, char * ** argv) ; rien d'autre ne marchera. (Au moins ... un système pourrait supporter int [STD :: String Const &) ou d'une autre comme une extension. Mais je n'ai jamais entendu parler d'un qui l'a fait.)


0 commentaires

3
votes

"transmettre une liste via Python à C ++" em> p>

Une autre approche serait d'utiliser Boost.python code> em> , cela peut ne pas répondre directement à votre question, mais sa peine d'être soulignée une autre solution. P>

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


0 commentaires

4
votes

Une autre option consiste à utiliser Cyron (pas une réponse directe). Voici un exemple complet complet:

Supposons que vous ayez les fichiers suivants:

CyTHON_FILE.CPP python_file.py setup.py Sum_MY_Vector.cppp sum_my_vector.h

setup.py xxx

cyron_file.pyx < Pré> xxx

sum_my_vector.cpp xxx

sum_my_vector.h < Pré> xxx

python_file.py xxx

exécuté maintenant

PYTHON SETUP. py build_ext --Enface

et vous pouvez exécuter le fichier python xxx


0 commentaires