2016-06-01 19 views
0

Ich habe zwei Binaries in eine für Vergleich purpose.py Datei kombiniert. Die zwei Binaries machen die sehr ähnliche Arbeit im Wesentlichen, verwenden aber zwei Sätze von CLI-Argumenten. Z. B.Wie vereinheitlichen Befehlszeilenargumente (Flags) für zwei verschiedene Binärdateien in Python

Erste Python binäre Par: myPar -myParArgs_1 '1' -myParArgs_2 'a'

Zweite cpp binäre Bin: myBin -myBinArgs_1 '1' -myBinArgs_2 'a'

Derzeit bin ich mit argparse Modul myPar Argumente angeben. Aber ich weiß nicht, wie ich mit der zweiten Binärdatei umgehen soll.

Gibt es eine Möglichkeit, diese beiden zu vereinheitlichen, so dass, wenn ich irgendwelche CLI-Argumente angeben, beide Binärdateien dasselbe tun und schließlich den Vergleichsbericht generieren können.

Zum Beispiel werden myMain -myMainArgs_1 '1' -myMainArgs_2 'a' beide Binärdateien mit jeweils korrekten Argumenten aufrufen.

+0

Was genau ist eine Python-Binärdatei? –

+0

Eine Hauptfunktion, die die CLI-Eingabe lesen und die Eingabe analysieren kann, um die Ausgabe zu erhalten. Ich habe das zweite Binary in diese Hauptfunktion eingefügt, indem ich 'subprocess.check_call' verwendet habe, aber ich weiß nicht, wie ich das zweite Binary mit dem gegebenen Befehl genauso machen kann wie das erste Binary. –

+0

Möchten Sie, dass sie dasselbe tun oder dieselben Argumente verwenden? Wenn dies gleichwertig ist, dann sind sie das gleiche Programm. Wenn nicht, dann sollten Sie klären. –

Antwort

1

Sie können ein drittes Skript schreiben, sei es Python-, Bash- oder Batch-Datei (abhängig vom Betriebssystem), das den besagten Argumentsatz übernimmt und jedes Binärwort in der richtigen Reihenfolge aufruft.

In Python sollte es etwa so aussehen

from sys import argv 
import subprocess 
call_args = sys.argv[1:] #first position is script name 
subprocess.call(['myPar'] + call_args) 
subprocess.call(['myBin'] + call_args) 
0

A Parent-Skript können andere Skripte mit subprocess Paket laichen. Die bekannteste ist Popen und Call (Anruf eine Anwendung von Popen ist)

-Link: https://docs.python.org/2/library/subprocess.html

**(For example, @compare.py -------------------)** 
import os 
from subprocess import * 

outputPar = Popen([r'C:\myPar.py', <your argument (flags)>], *shell=True,* stdin=PIPE, stdout=PIPE).communicate() 
outputBin = Popen([r'C:\myBin.py', <your argument (flags)>], *shell=True,* stdin=PIPE, stdout=PIPE).communicate() 
... process outputs ... 

Mit ein bisschen mehr Kommentar:

1) Shell = True kann keine gute Idee von Sicherheitswarnung

Warnung: Passing shell = True kann ein Sicherheitsrisiko darstellen, wenn es mit nicht vertrauenswürdigen Eingaben kombiniert wird. Weitere Informationen finden Sie in der Warnung unter Häufig verwendete Argumente. (https://docs.python.org/2/library/subprocess.html)

2) in Bezug auf Popen.communicate (input = None) Verfahren, Interact mit Prozess: Senden von Daten an stdin. Lesen Sie die Daten von stdout und stderr, bis das Dateiende erreicht ist. Warten auf Prozess bis beenden. Das optionale Eingabeargument sollte eine Zeichenfolge sein, die an den untergeordneten Prozess " " gesendet wird, oder "Keine", wenn keine Daten an das untergeordnete Element " " gesendet werden sollen.

communicate() returns a tuple (stdout, stderr). 

Note: The data read is buffered in memory, so do not use this 
method if the data size is large or unlimited.