Frage ein Python-Skript von einem anderen Skript importieren und es mit Argumenten ausführen


Ich habe ein Python - Skript, das als Befehlszeilenskript (dbtoyaml.py in Pyrenäen seit du fragst).

Ich führe ein anderes Python-Skript aus, von dem ich dieses Skript aufrufen möchte. Gibt es keine Möglichkeit, das Modul zu importieren und die erforderlichen Argumente aus meinem zweiten Skript künstlich aufzufüllen, um zu vermeiden, dass überhaupt der Pyraseas-Code geändert wird?

from pyrseas import dbtoyaml -- My initial script, which also takes arguments dbtoyaml.main(['-m','-H MYHOSTNAME' .... other options])

Hat noch nicht für mich gearbeitet.

Ich bekomme einen seltsamen Fehler:

usage: checkSchemaChanges.py [-h] [-H HOST] [-p PORT] [-U USERNAME] [-W]
                         [-c CONFIG] [-r REPOSITORY] [-o OUTPUT]
                         [--version] [-m] [-O] [-x] [-n SCHEMA]
                         [-N SCHEMA] [-t TABLE] [-T TABLE]
                         dbname
checkSchemaChanges.py: error: unrecognized arguments: MYHOSTNAME mydatabaseuser

Was ist eine Mischung aus meinem neuen Skript (checkSchemaChanges.py, und MYHOSTNAME und meindatabaseuser am unteren Rand) und den Parametern von dbtoyaml, die alle korrekt sind.

Könnte es der doppelte Parametersatz sein, der argwörtlich verwirrend ist?


9
2018-02-10 19:43


Ursprung


Antworten:


Dies scheint nicht der beste Weg zu sein, aber Sie können wahrscheinlich sys.argv setzen

import sys
sys.argv += ['-m','-H MYHOSTNAME' .... other options]
from pyrseas import dbtoyaml
dbtoyaml.main()

aber ich habe wirklich keine Ahnung, wie dbtoyaml.py aussieht oder ist


6
2018-02-10 19:47



Wenn ich ein Befehlszeilenskript schreibe, werde ich oft mein Skript speziell so entwerfen, dass dies möglich ist. Der Schlüssel besteht darin, die Argumente getrennt von der Hauptfunktion zu analysieren.

Zum Beispiel könnte die Hauptfunktion so aussehen:

def main(**kwargs):
    # the body of the script goes here

Dann werde ich an anderer Stelle im Modul den Arg-Parser konfigurieren, die Argumente parsen und das Ergebnis in das Hauptskript übernehmen:

def run():
    parser = ... # configure parser here
    configs = parse_args(parser)
    main(**configs)

Wenn jemand das Skript von Python aus aufrufen möchte, kann er das tun (es erleichtert auch das Testen):

import somescript
somescript.main(option='value', option2='value2')

Leider scheint es, dass die Autoren des Skripts, das Sie verwenden, nichts dergleichen tun. Wie in einer anderen Antwort angegeben, können Sie überschreiben sys.argv, dann importiere das Skript. Das mag zwar Hacky sein, aber es sollte weniger Ressourcenintensiv sein, als einen neuen Prozess zu öffnen und den Befehl separat aufzurufen.


12
2018-02-10 21:07