2016-03-03 10 views
5

Chciałbym użyć zmiennej liczby argumentów w zadaniu dla pyinvoke. tak:Jak używać zmiennej liczby argumentów w pyinvoke

from invoke import task 

@task(help={'out_file:': 'Name of the output file.', 
      'in_files': 'List of the input files.'}) 
def pdf_combine(out_file, *in_files): 
    print("out = %s" % out_file) 
    print("in = %s" % list(in_files)) 

Powyższe jest tylko jedna z wielu odmian starałem się, ale wydaje pyinvoke nie obsługuje zmienną liczbę argumentów. Czy to prawda?

Powyższe wyniki kodowe w

$ invoke pdf_combine -o binder.pdf -i test.pdf test1.pdf 
No idea what '-i' is! 

Podobnie, jeśli zdefiniować pdf_combine (plik_wyjściowy, in_file), bez gwiazdką przed in_file

$ invoke pdf_combine -o binder.pdf -i test.pdf test1.pdf 
No idea what 'test1.pdf' is! 

Gdybym wywołać zadanie z tylko jednym in_file jak poniżej działa poprawnie.

$ invoke pdf_combine -o binder.pdf -i test.pdf 
out = binder.pdf 
in = ['t', 'e', 's', 't', '.', 'p', 'd', 'f'] 

Co chciałbym zobaczyć to

$ invoke pdf_combine -o binder.pdf test.pdf test1.pdf test2.pdf 
out = binder.pdf 
in = [test.pdf test1.pdf test2.pdf] 

nie mogę znaleźć czegoś takiego w dokumentacji pyinvoke, choć nie mogę sobie wyobrazić, że inni użytkownicy tej biblioteki nie mają potrzebę wywołanie zadanie ze zmienną liczbą argumentów ...

+0

Czy pojawia się błąd? Jeśli tak, proszę uwzględnić ślad zwrotny w swoim pytaniu. – Forge

+0

Dzięki, bez śledzenia, pytanie dotyczy raczej korzystania z biblioteki pyinvoke. Poprawiłem moje pytanie kilkoma przykładami, które można wyjaśnić. – Killwas

Odpowiedz

3

można zrobić coś takiego:

from invoke import task 

@task 
def pdf_combine(out_file, in_files): 
    print("out = %s" % out_file) 
    print("in = %s" % in_files) 
    in_file_list = in_files.split(',') # insert as many args as you want separated by comma 

>> out = binder.pdf 
>> in = test.pdf,test1.pdf,test2.pdf 

Jeżeli komenda invoke jest:

invoke pdf_combine -o binder.pdf -i test.pdf,test1.pdf,test2.pdf 

nie mogłem znaleźć inny sposób, aby to zrobić czytając dokumentację pyinvoke.

+1

Dzięki. To wygląda na praktyczne i czyste rozwiązanie. Cieszę się, że niczego nie pominąłem w dokumentacji. Tymczasem użyłem zamiast tego modułu argparse. Potrzeba 20 minut, aby zrozumieć, ale warto było to zrobić. Właśnie dostrzegłem jego moc. Oczywiście pyinvoke nie zmierza w tym samym kierunku, co argparse. Słusznie. – Killwas

Powiązane problemy