2015-08-10 24 views
5

Testlerimden birinden Django yönetim komutunu aramak istiyorum. Bunun için django.core.management.call_command kullanıyorum. Ve işe yaramıyor.Django'nun call_command öğesi eksik argümanlarla başarısız oluyor

4 zorunlu argümanı olan bir komutum var. Onu aradığınızda, tüm argümanlar onları geçiyorum rağmen eksik yakınır:

call_command('my_command', url='12', project='abc', website='zbb', title='12345') 

Ben baz komut hatası alıyorum o --url, --project, --Forum ve --title eksik .

Bu argümanlar için farklı bir hedef belirtmedim.

Ben call_command kaynağında bakıp call_command aşağıdaki satıra sorunu kesin olarak belirlemiş:

if command.use_argparse: 
    # Use the `dest` option name from the parser option 
    opt_mapping = {sorted(s_opt.option_strings)[0].lstrip('-').replace('-', '_'): s_opt.dest 
        for s_opt in parser._actions if s_opt.option_strings} 
    arg_options = {opt_mapping.get(key, key): value for key, value in options.items()} 
    defaults = parser.parse_args(args=args) ****** THIS ***** 
    defaults = dict(defaults._get_kwargs(), **arg_options) 
    # Move positional args out of options to mimic legacy optparse 
    args = defaults.pop('args',()) 

args boş call_commands geçirilen pozisyonel argümanlar vardır. Sadece adlandırılmış argümanları geçiyorum. parser.parse_args gerekli değişkenlerin eksik olduğunu şikayet ediyor.

Django 1.8.3 sürümündedir. Yayınladığınız kod parçası dayanarak

def add_arguments(self, parser): 
    parser.add_argument('--url', action='store', required=True) 
    parser.add_argument('--project', action='store', required=True) 
    parser.add_argument('--continue-processing', action='store_true', default=False) 
    parser.add_argument('--website', action='store', required=True) 
    parser.add_argument('--title', action='store', required=True) 
    parser.add_argument('--duplicate', action='store_true',default=False) 
+1

Komutunuzun kodunu göster (en azından 'option_list 'tanımları) – Anentropic

+0

Add_arguments işlev kaynağı eklendi. – zmbq

+0

'arg1 = '12', arg2 = 'abc', arg3 = 'zbb', arg4 = '12345' 'anahtar kelime args ile gerçekten çağırıyor musunuz? 'parser.add_argument (' - url ') 'seçeneği için argüman argümanının' url 'olması gerektiğinin farkında mısınız? – Anentropic

cevap

3

, bunu call_command argument is required

yılında imzalanan ettik: Burada

benim komutun add_arguments fonksiyonudur (Sadece kısalık için yardım dizeleri kaldırıldı) Gerekli argümanlar sadece konumsal olarak değil, *args üzerinden geçirilmelidir. Ayrıştırıcıyı atlamak

**kwargs. Yani orada tanımladığınız hiçbir şey görmüyor. **kwargs, *args değerlerini geçersiz kılabilir, ancak *args her gerekli argüman için hala bir şeye ihtiyaç duyar. Bunu yapmak istemiyorsanız, required özniteliğini kapatın.

+1

Evet, bunu call_command'ın kodunda da gördüm. Call_command'da bir hata var. Gerekli argümanları * arşivlerde geçemiyorum - doğru sıraları nedir?Belki de add_argument, belki başka bir şey çağırdı sipariş, belki OS veya Python sürümü bağlıdır. Risk almak istemiyorum. – zmbq

+0

'argparse' siparişe karşı duyarsız olmaya çalışır. – hpaulj

+0

Nasıl olabilir * muhtemelen * duyarsız olabilir? Eğer '1', '2', '3', '4' harflerini satırlara koyarsam, hangisinin projenin hangisi olduğunu, nasıl bir proje olduğunu söyleyebilirim. – zmbq

İlgili konular