2010-09-23 19 views
5

के माध्यम से एक पायथन स्क्रिप्ट में शब्दकोशों को पास करना मैं कमांड लाइन पर किसी अन्य पायथन स्क्रिप्ट से एक पायथन स्क्रिप्ट में एक शब्दकोश को कैसे पास कर सकता हूं? मैं दूसरी स्क्रिप्ट को कॉल करने के लिए उपप्रोसेसर का उपयोग करता हूं।कमांड लाइन

मेरे द्वारा आने वाले विकल्प हैं:
I) एक स्ट्रिंग से एक शब्दकोश को पार्स करने के लिए एक मॉड्यूल बनाएं (जितना गहराई से मुझे जाने की उम्मीद थी)।
II) एक अचार लिखने के लिए एक अस्थायी फ़ाइल का उपयोग करें, और फ़ाइल का नाम एक तर्क के रूप में पास करें
III) शब्दकोशों की अनुमति न दें, लेकिन कुंजी/मूल्य जोड़े को संभालें (जो "prog.py keya valuea keyb valub" है)

समाधान उपयोगकर्ता के अनुकूल नहीं होना चाहिए, लेकिन कार्यक्रम के अनुकूल होने की आवश्यकता है। सुरक्षा और संसाधन चिंताओं के कारण दूसरा कार्यक्रम एक अलग प्रक्रिया के रूप में चलाया जाना चाहिए।

उत्तर

6

के अलावा, एक और विकल्प है ast.literal_eval, यदि आपके शब्दकोश में केवल पायथन प्राइमेटिव हैं।

>>> d = {3: 9, 'apple': 'orange'} 
>>> s = str(d) 
>>> s 
"{3: 9, 'apple': 'orange'}" 
>>> import ast 
>>> x = ast.literal_eval(s) 
>>> x 
{3: 9, 'apple': 'orange'} 
+0

यह वही था जो मैं –

6

यदि आपको बहुत जटिल डेटा संरचना की आवश्यकता नहीं है, तो क्या मैं simplejson की अनुशंसा कर सकता हूं? यह पाइथन 2.6 और बाद में अंतर्निर्मित मॉड्यूल (json कहा जाता है) के रूप में उपलब्ध है।

+0

हाँ, आप दूसरे के stdin को यह लिख कर json धारावाहिक शब्दकोश पारित कर सकते हैं स्क्रिप्ट। – Epeli

+0

+1 क्योंकि JSON सरल, प्रभावी, और लगभग पाइथन की 'dict' संरचना के समान है। – jathanism

+0

+1 क्योंकि यह सही है, हालांकि FoggleBird का जवाब सही है, और मैं किसी भी चीज़ में बॉस से बात नहीं कर सकता जो जावास्क्रिप्ट –

8

क्या आपने pickle मॉड्यूल को stdout/stdin पर डेटा पास करने के लिए देखा है?

उदाहरण:

knights.py:

import pickle 
import sys 

desires = {'say': 'ni', 'obtain': 'shrubbery'} 
pickle.dump(desires, sys.stdout) 

roundtable.py:

import pickle 
import sys 

knightsRequest = pickle.load(sys.stdin) 
for req in knightsRequest: 
    print "The knights %s %s." % (req, knightsRequest[req]) 

उपयोग और उत्पादन: pickle से

$ python knights.py | python roundtable.py 
The knights say ni. 
The knights obtain shrubbery. 
+0

कोई बुरा विचार नहीं है! – jathanism

0

बस एक अजगर स्क्रिप्ट

print("dict=" + str(dict)) 

में शब्दकोश मुद्रित करें और

(python script1.py; cat script2.py) | python - 

इसका इस्तेमाल और अब आप में सक्षम पहुँच वैश्विक चर 'dict' में के माध्यम से किया जाना चाहिए शब्दकोश दूसरी पायथन लिपि।

2

यदि शब्दकोश में क्या है (दोनों कुंजी और मान) स्ट्रिंग के रूप में प्रदर्शित किए जा सकते हैं, तो आप इसे दूसरी स्क्रिप्ट के स्ट्रिंग तर्क के रूप में पास करने में सक्षम होना चाहिए जो इसे पुन: बना सकता है।

d = {'a':1,'b':2} 

d == eval(repr(d), None) 

>>>True 

संपादित करें: यहाँ एक से थोड़ा अधिक शामिल एक सरल कस्टम वर्ग के साथ इसके उपयोग दिखा उदाहरण है:

class MyClass: 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 
    def __repr__(self): 
     return 'MyClass(%r, %r)' % (self.a, self.b) 
    def __eq__(self, other): 
     return (self.a == other.a) and (self.b == other.b) 

d = {'foo':42, 'bar': MyClass(17,'astring') } 

print 'd:', d 
print 'repr(d):', repr(d) 
print "d == eval(repr(d), {'MyClass':MyClass})?:", \ 
     d == eval(repr(d), {'MyClass':MyClass}) 

# outputs: 
# d: {'foo': 42, 'bar': MyClass(17, 'astring')} 
# repr(d): {'foo': 42, 'bar': MyClass(17, 'astring')} 
# d == eval(repr(d), {'MyClass':MyClass})?: True 
+0

'ast.literal_eval' के लिए देख रहा था यह करने का सुरक्षित और सही तरीका है। – FogleBird

+0

'ast.literal_eval()' बहुत प्रतिबंधित हो सकता है। किसी के बजाए, 'eval()' को दूसरी तर्क को पार करना संभव है, जिसके बदले एक कस्टम मैपिंग कस्टम क्लास नाम संबंधित कस्टम क्लास के लिए मैपिंग कर रहा है, जो प्रदान किए जाने पर, तारों को जोड़ने के लिए उनके उदाहरणों को पुनर्निर्मित करने की अनुमति भी देगा , tuples, सूचियों, dicts, बूलियन, और कोई भी मूल्य प्रकार है कि 'ast.literal_eval()' समर्थन करता है। – martineau