2010-09-09 14 views
10

जो मैं प्राप्त करना चाहता हूं वह निम्न शेल कमांड का लॉन्च है:पाइथन 2.4 से इनपुट पुनर्निर्देशन के साथ शेल कमांड चलाएं?

mysql -h hostAddress -u userName -p userPassword 
databaseName < fileName 

एक पायथन 2.4 स्क्रिप्ट के भीतर से कुछ विपरीत नहीं है:

cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName, "<", file] 
subprocess.call(cmd) 

यह पुक्स के उपयोग के कारण रीडायरेक्ट प्रतीक (मुझे विश्वास है) - mysql इनपुट फ़ाइल प्राप्त नहीं करता है।

मैंने यह भी कोशिश की है:

subprocess.call(cmd, stdin=subprocess.PIPE) 

कोई नहीं वहाँ ether

क्या कोई शेल कॉल करने के लिए सिंटैक्स निर्दिष्ट कर सकता है जैसे कि मैं एक फ़ाइल पुनर्निर्देशन में फ़ीड कर सकता हूं?

अग्रिम धन्यवाद।

+0

आपको बाहरी mysql क्लाइंट – ghostdog74

+0

@ user131527 पर कॉल करने के बजाय पाइथन MySQL इंटरफ़ेस का उपयोग करना चाहिए इंटरफ़ेस इस मामले में हाँ काम करेगा। मुझे किसी भी तरह से पाइथन के भीतर से फ़ाइल को रीडायरेक्ट करने में दिलचस्पी थी और यह एक अच्छा उदाहरण – SMTF

उत्तर

11

आपको फ़ाइल को अपने द्वारा mysql stdin में फ़ीड करना होगा। यह करना चाहिए।

import subprocess 
... 
filename = ... 
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName] 
f = open(filename) 
subprocess.call(cmd, stdin=f) 
4

प्रतीक < केवल खोल में (stdin करने के लिए एक फ़ाइल को पढ़ने मैं। ई।) इस अर्थ नहीं है। अजगर में आप दोनों में से किसी का उपयोग करना चाहिए निम्नलिखित:

1) अपनी प्रक्रिया में फ़ाइल की सामग्री पढ़ें और बच्चे की प्रक्रिया के stdin को धक्का:

fd = open(filename, 'rb') 
try: 
    subprocess.call(cmd, stdin=fd) 
finally: 
    fd.close() 

2) खोल के माध्यम से फ़ाइल सामग्री पढ़ें (जैसा कि आप का उल्लेख किया), लेकिन अपने प्रक्रिया के stdin तदनुसार अनुप्रेषित:

# In file myprocess.py 
subprocess.call(cmd, stdin=subprocess.PIPE) 

# In shell command line 
$ python myprocess.py < filename 
+1

मामूली सुधार के रूप में कार्य करता था: 2.4 में कोई 'स्टेटमेंट' नहीं है। – Constantin

+0

@ कॉन्स्टेंटिन धन्यवाद। –

+0

यह मेरी कॉन्फ़िगरेशन से संबंधित हो सकता है लेकिन subprocess.PIPE निर्दिष्ट करना stdin के रूप में बस लटका दिया। एक फ़ाइल के रूप में पढ़ना अच्छी तरह से काम किया। धन्यवाद! – SMTF

0

एंड्री के रूप में सही ढंग से देखा, < पुनर्निर्देशन ऑपरेटर खोल से व्याख्या की है। इसलिए एक और संभव समाधान:

import os 
os.system("mysql -h " + ip + " -u " + mysqlUser + " " + dbName) 

यह काम करता है क्योंकि os.system खोल करने के लिए अपने तर्क से गुजरता है।

ध्यान दें कि मुझे लगता है कि सभी उपयोग किए गए चर विश्वसनीय स्रोत से आते हैं, अन्यथा आपको मनमाने ढंग से कोड निष्पादन को रोकने के लिए उन्हें सत्यापित करने की आवश्यकता है। इसके अलावा उन चरों में व्हाइटस्पेस (डिफ़ॉल्ट IFS मान) या शैल विशेष वर्ण नहीं होना चाहिए।

+0

यह os.system ध्वनि को उप-स्थानापन्न करने के लिए कहीं अधिक सुविधाजनक बनाता है। मुझे यह सोचने में गलती हुई कि ओएससिस्टम को बहिष्कृत किया जा रहा था। जवाब के लिए धन्यवाद। – SMTF

+0

ठीक है, मैं खुद को सबप्रोसेस-समाधान पसंद करूंगा, यह कई तरीकों से बेहतर है (उदाहरण के लिए यह अधिक पोर्टेबल होना चाहिए)। –

संबंधित मुद्दे