2016-07-28 16 views
0

Der Befehl:

make foo -f $* 

hat verschiedene Funktionen, wenn sie von der Kommandozeile im Vergleich aufgerufen, wenn es von einem Python-Skript wird wie folgt aufgerufen:

import os 
os.system(make foo -f $*) 

wie hier angegeben: http://tldp.org/LDP/abs/html/internalvariables.html#APPREF $ * in einem Fledermaus-Datei ist im Grunde alle Positionsparameter als ein einzelnes Wort gesehen.

Python scheint es als einfach "$ *" zu analysieren. Gibt es da irgendwie um dies zu umgehen und die gleiche Funktionalität zu replizieren?

Ich weiß, ich kann ein .bat-Skript schreiben und das mit Python nennen, aber ich hatte auf etwas eloquenter gehofft.

+0

Vergessen Sie "os.system". Benutze immer die Funktionen von 'subprocess' und * vermeide * so viel wie möglich' shell = True' zu ​​übergeben. – Bakuriu

Antwort

1

Wie Sie betonen, hat $ * in Python keine besondere Bedeutung. Das Verständnis wird vollständig von der Shell, die Sie verwenden, durchgeführt. Wenn Sie alle Positionsparameter übergeben an das Skript zu einem gewissen Befehl übergeben wollen, dann können Sie versuchen, die folgenden

import os, sys 
os.system("make foo -f {}".format(" ".join(sys.argv[1:]))) 

Bitte beachten Sie jedoch, dass os.system veraltet. Sie sollten wahrscheinlich

import subprocess, sys 
subprocess.check_call("make foo -f {}".format(" ".join(sys.argv[1:])), shell=True) 

stattdessen verwenden.

bearbeiten

Wie in den Kommentaren vorgeschlagen, sollte man mit shell=True vermeiden, wenn der Befehl von „nicht vertrauenswürdig“ -Eingang, wie die Befehlszeile des Programms erstellt wird. Daher ist eine viel bessere Alternative zu verwenden

import subprocess, sys 
subprocess.check_call(['make', 'foo', '-f'] + sys.argv[1:]) 
+2

Beachten Sie, dass es keinen Grund gibt, 'shell = True' dafür zu verwenden. Es ist einfacher, einfach 'check_call (['make', 'foo', '-f'] + sys.argv [1:])' 'zu verwenden, um sogar den Aufruf von' join' loszuwerden. – Bakuriu

+0

@Bakuriu Guter Punkt :) –

+0

@Bakuriu schlug mich dazu - kein Grund, Shell hier zu verwenden, da das Beispiel-es ist am besten, es zu vermeiden, wenn potenziell "interessante" Befehle durch –