de sortie de la ligne de commande appelé par le sous-processus?
Je suis en utilisant le subprocess.Popen
appel, et dans une autre question, j'ai découvert que j'avais été un malentendu comment Python qui génère des arguments de la ligne de commande.
Ma Question
Est-il un moyen de savoir quel est le véritable ligne de commande a été?
Exemple De Code :-
proc = subprocess.popen(....)
print "the commandline is %s" % proc.getCommandLine()
Comment écririez-vous getCommandLine
?
Vous devez vous connecter pour publier un commentaire.
Cela dépend de la version de Python que vous utilisez. En Python3.3, l'arg est enregistré dans
proc.args
:En Python2.7, le
args
ne sont pas enregistrées, il est juste passé à d'autres fonctions comme le_execute_child
. Alors, dans ce cas, la meilleure façon d'obtenir la ligne de commande est à enregistrer lorsque vous avez:Notez que si vous avez la liste des arguments (comme le type de chose retourné par
shlex.split(cmd)
, alors vous pouvez récupérer la chaîne de ligne de commande,cmd
sans-papiers à l'aide de la fonctionsubprocess.list2cmdline
:list2cmdline
, mais plutôtshlex.split
.shlex.split('--arg="foo bar"')
renvoie une liste avec un seul élément:['--arg=foo bar']
, tandis queshlex.split('--arg = "foo bar"')
correctement divise les arguments:['--arg', '=', 'foo bar']
. Sur cette dernière listelist2cmdline
fonctionne très bien.subprocess
module utiliselist2cmdline
pour convertirargs
à une liste à chaque fois queargs
n'est pas une chaîne de sorte qu'il fonctionne dans le sens que ce que vous voyez que la valeur de retour delist2cmdline(args)
est exactement ce qui est transmis àexecvp*
ou l'équivalent Windows.list2cmdline
. Il attend une liste pas une chaîne.cmdline = ["cmd", "--arg=foo bar", "baz"]
je puis exécutez popen avec cmdline, et obtenircmd --arg="foo bar" baz
Quand je l'appellelist2cmdline(cmdline)
- je obtenircmd "--arg=foo bar" baz
subprocess.Popen('cmd "--arg=foo bar" baz', shell=True)
il fonctionne, mais lorsque vous utilisezsubprocess.Popen(shlex.split('cmd "--arg=foo bar" baz'))
(sansshell=True
) il ne parvient pas?subprocess.Popen(cmdline)
et il fonctionne. Quand je l'appellelist2cmdline(cmdline)
il donne une ligne de commande qui ne fonctionne pas.La bonne réponse à ma question est en fait qu'il n'y EST pas de ligne de commande. Le point de sous-processus, c'est qu'il fait tout par le biais de l'IPC. Le list2cmdline n'est aussi proche que peut être prévu, mais en réalité, la meilleure chose à faire est de regarder la "args" de la liste, et il suffit de savoir que ce sera argv dans le programme.
list2cmdline()
est utile uniquement sur Windows pour les applications compatibles avec la façon dont microsoft C runtime analyse de la ligne de commande. Il convertit une liste d'arguments de la chaîne passée àCreateProcess()
.cmd.exe
utilise différentes règles. Sur POSIX la liste est transmise directement àos.execve()
(+/- os.fsencode()).Belle et méthode évolutive
J'ai été en utilisant quelque chose comme ceci:
Exemple d'exécution:
De sortie:
Résumé des caractéristiques:
+
à des commandes commesh -x
de sorte que les utilisateurs peuvent se différencier des commandes depuis leur sortie facilementcd
, et des variables d'environnement supplémentaires s'ils sont donnés à la commande. Ces imprimés que si elle est donnée, en ayant un minimum de commande shell.Tout cela permet aux utilisateurs de facilement copier les commandes manuellement afin de les exécuter si quelque chose tombe en panne, ou pour voir ce qui se passe.
Testé sur Python 3.5.2, Ubuntu 16.04. GitHub en amont.