2016-03-26 22 views
-1

Ben iyi çalışırpython istekleri üstbilgileri bir değişken olarak mı saklıyor?

headers = {'content-type': 'application/soap+xml'} 

var. sağlayan benim args yüzden bir argüman olarak belirtilmesi bu mümkün istiyorum ancak bunu ancak zaman ... Bu

{'content-type': 'application/soap+xml'} 

olarak ince yoluyla geliyor ben

--wsheaders {'content-type':\s'application/soap+xml'} 

söylüyorlar

headers = args.wsheaders 

Tonlarca hata alıyorum. Açıkçası başlıklar bir dizi olamaz. Fakat bunu bir değişkende tekrar okunabileceği bir yerde saklamanın bir yolu olmalı? Herhangi bir fikir?

DÜZENLEME: Bağımsız değişkenin çevresindeki tek tırnakları kullanamıyorum. Bunu hala öğreniyorum ama argümanları bir dosyadan aktarırken bir argümanın etrafında tek veya çift tırnak kullanmıyorum gibi görünebilir, ama chars'ı birlikte gruplamak için işe yaramıyor, bunun yerine literal bir parça oluyor. Bir boşluktan önce veya sonra her şeyi kaybettiğimden beri yardımcı olmayan argümanın. Dosyada neye benzediğine ilişkin eke bakın.

--wsheaders '{'content-type': 'application/soap+xml'}' 

hata

wsheaders in properties file

tek tırnak veya çift tırnak

bunun yerine ben

--wsheaders {'content-type':\s'application/soap+xml'} 

kullanmak

Sync03.py: error: unrecognized arguments: 'application/soap+xml'}' 
Sync03.py: error: unrecognized arguments: 'application/soap+xml'}" 

ama sonra \ s ihtiyaçlarını kullanarak arg sonra değiştirilecek Benim yaptığım girilir, ama sonra değişken bir dizedir ve ben ordayım. bir problem. o tanınmayan bir json beri bir \ s varken

type=json.loads 

argüman tanımında çalışmaz. \\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\}. Bir \ s

Sync03.py: error: argument --wsheaders: invalid loads value: "{'content-type':" 
Sync03.py: error: argument --wsheaders: invalid loads value: "{'content-type':\\s'application/soap+xml'}" 

EDIT'e

parser.add_argument('--wsheaders', type=lambda x: json.loads(x.replace('\s', '').replace('\'', '"'))) 

ile daha sonra bir yeri olan bu doğrudan aşağıda bschlueter açıklama gereği çalıştı.

the_script --wsheaders '{"content-type": "application/soap+xml"}' 

Sonra, json olarak ayrıştırmak:

+0

En azından, kodunuzdaki hataları yazabilirsiniz. – bschlueter

+0

''{' content-type ':' application/soap + xml '}'' çalışmıyor çünkü iç '' 'daha önceki olanlarla eşleşiyor. Bunun geçerli bir dize olması için içlerinden kaçmanız gerekir. '' {\ 'content-type \': \ 'application/soap + xml \'} ''tek, geçerli bir dizge yapardı, ancak json geçerli değil, çünkü json çift tırnak gerektirir. ''{" content-type ":" application/soap + xml "}'', aynı verinin geçerli json gösterimidir. – bschlueter

+0

Kesinlikle * \ s * 'yi argparse ile değiştirebilirsiniz, sadece girdiyi düzelten bir özel tip kullanın: 'parser.add_argument (' - wsheaders ', type = lambda x: json.loads (x.replace (' \ s) ',' ') .replace (' \ '', '"'))) – bschlueter

cevap

0

Eğer herhangi bir şekilde argüman, yapmanız gereken tüm alıntı başlıklarını komut dosyası bunları geçerken olduğu gibi python komut --wsheaders tüketirlerken varsayarsak Dict'ı al.

kullanma PyYAML:

>>> import yaml 
>>> yaml.load(args.wsheaders) 
{'content-type': 'application/soap+xml'} 

DÜZENLEME:

Eğer argparse (siz olması gerektiği gibi) bağımsız değişken ile bağımsız değişken bildirerek çözümlenir zaman, kolayca ayrıştırmayı yapabilirsiniz kullanıyorsanız:

parser = argparse.ArgumentParser() 
parser.add_argument('--wsheaders', type=json.loads) 
args = parser.parse_args() 
+0

downvoter nazik muhakeme Could ne – bschlueter

+0

donno neden downvote, ama bu? Mükemmel bir şekilde çalıştı.Şimdi ne kadar yaml olduğunu bilmiyordum.Aşağıdaki ortamlarda olduğu gibi başka bir paket (yaml) eklemeden bunu yapabilmeyi umuyordum, dışarıdaki şeyleri kurmak zor. pip var ama pyaml ile çalıştığınız şey yaml ithalatı kurdu.Yalnızca bağımsız bir yol bulmak zorunda kalacak durak Bir demet teşekkürler! –

+0

Yaml, json'un bir üst kümesidir ve varsayılan olarak benim kabuk yüküm var, bu yüzden küçük bir miktar ile json'dan daha kolay elde edildi. Açıkçası, json.loads (args.wsheaders) 'sadece iyi çalışırdı. – bschlueter

1

argparse kullandığını farz ettim. Aslında argparse yılında

dize olarak argümanlar geçirdi yakalar sys.argv kullanır. Yani bu durumda dictionary dizgisi olarak geçiyorsunuz ve bu nedenle sözlük olarak ayrıştırmanız gerekiyor çünkü requests sözlük olarak başlık gerekiyor. args.wsheaders dize olduğundan bu nedenle headers = args.wsheaders için

işe yaramaz. Sen komut satırı argümanı olarak sözlüğünü geçirerek ve here, here ve here de bunları doğru ayrıştırma aşağıda-

headers = ast.literal_eval(args.wsheaders)

Daha detay olarak sözlük olarak ayrıştırmak için json veya ast kullanmak gerekir.

+0

Bu, başlıkların komut dosyasına nasıl aktarıldığını açıklamıyor. – bschlueter

+0

@bschlueter '--wsheaders' ve' args.wsheaders'ı görmeyi * kabul ettim * yukarıda bahsettiğim gibi 'argparse' kullanarak geçen komut satırı argümanını kullanır. – SIslam

+0

Doğru, ama OP'nin argümanı '--wsheaders' 'a aktarmanın yolu, kabuğun python'a nasıl geçeceğinden dolayı başarısız olacaktır. – bschlueter

İlgili konular