मुझे पाइथन की उपप्रोसेस.पोपेन विधि में कोई समस्या है।सबप्रोसेस क्यों है। बच्चे की प्रक्रिया समाप्त होने तक प्रतीक्षा न करें?
यहां एक टेस्ट स्क्रिप्ट है जो समस्या का प्रदर्शन करती है। यह एक लिनक्स बॉक्स पर चल रहा है।
#!/usr/bin/env python
import subprocess
import time
def run(cmd):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
return p
### START MAIN
# copy some rows from a source table to a destination table
# note that the destination table is empty when this script is run
cmd = 'mysql -u ve --skip-column-names --batch --execute="insert into destination (select * from source limit 100000)" test'
run(cmd)
# check to see how many rows exist in the destination table
cmd = 'mysql -u ve --skip-column-names --batch --execute="select count(*) from destination" test'
process = run(cmd)
count = (int(process.communicate()[0][:-1]))
# if subprocess.Popen() waited for the child to terminate than count should be
# greater than 0
if count > 0:
print "success: " + str(count)
else:
print "failure: " + str(count)
time.sleep(5)
# find out how many rows exists in the destination table after sleeping
process = run(cmd)
count = (int(process.communicate()[0][:-1]))
print "after sleeping the count is " + str(count)
आम तौर पर इस स्क्रिप्ट से उत्पादन होता है:
success: 100000
लेकिन कभी कभी यह है
failure: 0
after sleeping the count is 100000
ध्यान दें कि विफलता के मामले में, चुनें तुरंत डालने के बाद 0 पंक्तियों लेकिन उसके बाद से पता चलता 5 सेकंड के लिए सोते हुए दूसरा चयन सही ढंग से 100000 की पंक्ति गणना दिखाता है। मेरा निष्कर्ष यह है कि निम्न में से एक सत्य है:
- subprocess.Popen समाप्त करने के लिए बच्चे को थ्रेड के लिए प्रतीक्षा नहीं है - यह प्रलेखन खंडन करने के लिए लगता है
- mysql डालने परमाणु नहीं है - mysql की मेरी समझ से संकेत मिलता है डालने परमाणु है
- का चयन नहीं है लगता है सही पंक्ति अभी गिनती देखकर - एक दोस्त है जो mysql बेहतर जानता है की तुलना में मैं यह या तो
मैं क्या याद आ रही है ऐसा नहीं होना चाहिए करने के लिए अनुसार?
एफवाईआई, मुझे पता है कि यह पाइथन से MySQL के साथ बातचीत करने का एक हैकी तरीका है और MySQLdb की संभावना नहीं है, लेकिन मुझे उत्सुकता है कि यह विधि क्यों काम नहीं करती है।
सभी को धन्यवाद। सबप्रोसेस दस्तावेज को फिर से देखकर मैं देखता हूं कि मुझे "आदेश के लिए प्रतीक्षा करें" टिप्पणी से फेंक दिया गया था जो सुविधा विधियों अनुभागों में दिखाई देता है जो पॉपन विधि अनुभाग नहीं है। मैंने जेड के जवाब को मंजूरी दे दी क्योंकि यह मेरे मूल प्रश्न का सबसे अच्छा जवाब देता है, हालांकि मुझे लगता है कि मैं अपनी भविष्य की स्क्रिप्टिंग आवश्यकताओं के लिए पॉल के समाधान का उपयोग करूंगा। –
ध्यान रखें कि os.system (जब तक आप इसके साथ कुछ और नहीं करते) प्रक्रिया के रिटर्न VALUE (आमतौर पर 0 या 1) देता है। आपको या तो काटने मत देना। –