Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

सबप्रोसेस क्यों है। बच्चे की प्रक्रिया समाप्त होने तक पॉपन प्रतीक्षा नहीं कर रहा है?

subprocess.Popen , जब तत्काल, प्रोग्राम चलाता है। हालांकि, यह इसके लिए प्रतीक्षा नहीं करता है -- यह इसे पृष्ठभूमि में सक्रिय करता है जैसे कि आपने cmd & टाइप किया हो एक खोल में। तो, उपरोक्त कोड में, आपने अनिवार्य रूप से दौड़ की स्थिति को परिभाषित किया है - यदि सम्मिलन समय पर समाप्त हो सकता है, तो यह सामान्य दिखाई देगा, लेकिन यदि आपको अप्रत्याशित आउटपुट नहीं मिलता है। आप अपने पहले run() . की प्रतीक्षा नहीं कर रहे हैं 'd PID समाप्त करने के लिए, आप बस उसका Popen लौटा रहे हैं उदाहरण और जारी।

मुझे यकीन नहीं है कि यह व्यवहार दस्तावेज़ीकरण के विपरीत कैसे है, क्योंकि पॉपन पर कुछ बहुत स्पष्ट तरीके हैं जो इंगित करते हैं कि इसका इंतजार नहीं किया गया है, जैसे:

Popen.wait()
  Wait for child process to terminate. Set and return returncode attribute.

हालांकि, मैं इस बात से सहमत हूं कि इस मॉड्यूल के दस्तावेज़ीकरण में सुधार किया जा सकता है।

कार्यक्रम के समाप्त होने की प्रतीक्षा करने के लिए, मैं subprocess . का उपयोग करने की सलाह दूंगा की सुविधा विधि, subprocess.call , या communicate . का उपयोग कर रहे हैं एक Popen . पर ऑब्जेक्ट (उस मामले के लिए जब आपको स्टडआउट की आवश्यकता होती है)। आप अपनी दूसरी कॉल के लिए पहले से ही ऐसा कर रहे हैं।

### 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'
subprocess.call(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 = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
try: count = (int(process.communicate()[0][:-1]))
except: count = 0

इसके अतिरिक्त, ज्यादातर मामलों में, आपको शेल में कमांड चलाने की आवश्यकता नहीं होती है। यह उन मामलों में से एक है, लेकिन आपको अपने आदेश को अनुक्रम की तरह फिर से लिखना होगा। ऐसा करने से आप पारंपरिक शेल इंजेक्शन से बच सकते हैं और उद्धरण के बारे में कम चिंता कर सकते हैं, जैसे:

prog = ["mysql", "-u", "ve", "--execute", 'insert into foo values ("snargle", 2)']
subprocess.call(prog)

यह काम भी करेगा, और आपकी अपेक्षानुसार इंजेक्शन नहीं लगाएगा:

prog = ["printf", "%s", "<", "/etc/passwd"]
subprocess.call(prog)

इसे अंतःक्रियात्मक रूप से आजमाएं। आप शेल इंजेक्शन की संभावनाओं से बचते हैं, खासकर यदि आप उपयोगकर्ता इनपुट स्वीकार कर रहे हैं। मुझे संदेह है कि आप सबप्रोसेस के साथ संचार करने की कम-भयानक स्ट्रिंग विधि का उपयोग कर रहे हैं क्योंकि आपको अनुक्रमों को काम करने में परेशानी हो रही है:^)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:कनेक्शन बंद होने के बाद कोई संचालन की अनुमति नहीं है

  2. mysql सारांश का उपयोग करते हुए सभी पंक्तियों को पुनः प्राप्त कर रहा है

  3. mysql वर्चर (10) को टाइमस्टैम्प में कैसे परिवर्तित करें?

  4. मैं HTML सामग्री (MySQL) के लिए किस संरचना प्रकार का उपयोग करता हूं

  5. MySQL में कैरेक्टर सेट को latin1 से UTF8 में कैसे बदलें?