2015-02-10 5 views
5

Mam skrypt Pythona, który został spakowany jako skrypt wiersza poleceń (dbtoyaml.py w Pyrseas, ponieważ pytasz).importowanie skryptu Pythona z innego skryptu i uruchamianie go z argumentami

Używam innego skryptu Pythona, z którego chcę nazwać ten skrypt. Czy nie ma możliwości zaimportowania modułu i sztucznego zapełnienia wymaganych argumentów z mojego drugiego skryptu, aby w ogóle uniknąć zmiany jakiegokolwiek kodu pirseas?

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

jeszcze nie pracował dla mnie.

mam dziwny błąd:

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 

który jest mieszaniną mojego nowego skryptu (checkSchemaChanges.py i myhostname i mydatabaseuser na dole), a parametry z dbtoyaml, które są poprawne.

Czy to może być podwójny zestaw parametrów, które mylą argparse?

Odpowiedz

3

ten wydaje się nie jest najlepszym sposobem, aby to zrobić, ale prawdopodobnie można ustawić sys.argv

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

ale naprawdę nie mam pojęcia, co dbtoyaml.py lookslike czy

+0

To zadziałało, ale musiałem zastąpić sys.argv, nie dodawać do niego, tj. Sys.argv = ... dzięki –

9

Kiedy jestem pisanie skryptu wiersza poleceń Często będę projektował mój skrypt, więc jest to możliwe. Kluczem jest sparsowanie argumentów niezależnych od głównej funkcji.

Na przykład główna funkcja może wyglądać następująco:

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

Następnie indziej w module będę skonfigurować parser Arg, analizować args i przekazać wynik do głównego skryptu:

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

ten sposób, jeśli ktoś chce wywołać skrypt z poziomu Pythona, mogą to zrobić (ale również sprawia, testowanie znacznie łatwiejsze):

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

Niestety, wydaje się, że autorzy skryptu, którego używasz, nie zrobili nic takiego. Jak stwierdzono w innej odpowiedzi, możesz zastąpić sys.argv, a następnie zaimportować skrypt. Chociaż może to wyglądać na zjadliwe, powinno być mniej zasobów niż otwarcie nowego procesu i wywoływanie polecenia osobno.

+0

Zacząłem to robić i dzięki temu moje skrypty stały się bardziej elastyczne i można je wielokrotnie używać. Świetna sugestia. – user5359531