2015-02-10 6 views
5

Komut satırı komut dosyası olarak paketlenmiş bir python betiğim var (sizden bu yana Pyrseas numaralı telefondan dbtoyaml.py).Başka bir komut dosyasından bir python betiği içe aktarma ve bağımsız değişkenlerle çalıştırılıyor

Bu komut dosyasını aramak istediğim başka bir python betiği çalıştırıyorum. Herhangi bir pyrseas kodunu değiştirmekten kaçınmak için, modülü içe aktarmanın ve ikinci senaryonumdan gerekli argümanları yapay olarak yerleştirmenin bir yolu yok mu?

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

henüz benim için çalıştı etmemiştir.

Garip bir hata alıyorum:

(altta checkSchemaChanges.py ve myHostName ve mydatabaseuser) benim yeni senaryonun karışımı ve hepsi doğru dbtoyaml gelen parametreler olduğunu
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 

.

Kafa karıştırıcı argparse olan çift parametre kümesi olabilir mi?

cevap

3

bunu yapmak için değil en iyi yol gibi görünüyor ama muhtemelen sys.argv

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

ayarlayabilirsiniz ama gerçekten lookslike ya da ben olduğum zaman

+0

Bu, ancak çalıştı, ama sys.argv yerine eklemek zorunda kaldı, yani, sys.argv = ... teşekkürler –

9

olduğunu dbtoyaml.py hiçbir fikrim yok Komut satırı senaryosu yazmak genellikle komut dosyamı özel olarak tasarlayacaktır, böylece bu mümkün. Anahtar, ana işlevden ayrı olan başlıkların ayrıştırılmasıdır. Ben arg ayrıştırıcı yapılandıracak modülünde başka yerde Sonra

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

args ayrıştırmak ve ana komut içine geçmesi sonucunu:

Örneğin ana işlevi aşağıdaki gibi görünebilir

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

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

bu şekilde, birisi Python içinden senaryoyu aramak istiyor, onlar bunu yapabilirler (aynı zamanda test çok daha kolay hale getirir)

Maalesef, kullandığınız komut dosyasının yazarlarının böyle bir şey yapmadığı anlaşılıyor. Başka bir cevapta belirtildiği gibi, sys.argv'un üzerine yazıp komut dosyasını içe aktarabilirsiniz. Bu rahatsız edici olsa da, yeni bir süreç açmaktan ve komutu ayrı ayrı aramaktan daha az kaynak yoğun olmalıdır.

+0

Bunu yapmaya başladım ve bu benim scriptlerimi daha esnek ve yeniden kullanılabilir hale getirdi. Büyük öneri. – user5359531