सबप्रोसेस पॉपेन का उपयोग कैसे करें


102

चूंकि os.popen को subprocess.popen द्वारा प्रतिस्थापित किया जा रहा है, मैं सोच रहा था कि मैं कैसे परिवर्तित करूंगा

os.popen('swfdump /tmp/filename.swf/ -d')

to subprocess.popen ()

मैंने कोशिश की:

subprocess.Popen("swfdump /tmp/filename.swf -d")
subprocess.Popen("swfdump %s -d" % (filename))  # NOTE: filename is a variable
                                                # containing /tmp/filename.swf

लेकिन मुझे लगता है कि मैं इसे ठीक से नहीं लिख रहा हूं। किसी भी सहायता की सराहना की जाएगी। धन्यवाद


1
क्या यह विंडोज मशीन या लिनक्स मशीन है?
एएआई

जवाबों:


141

subprocess.Popen तर्कों की एक सूची लेता है:

from subprocess import Popen, PIPE

process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

यहां तक कि उपयोगकर्ताओं को माइग्रेट करने में मदद करने के लिए समर्पित प्रलेखन का एक वर्ग भी os.popenहै subprocess


18
@ हंसेन shell=Trueकी सिफारिश नहीं की गई है।
पियरे जीएम

7
@ लुकास ग्राफ चूंकि कोड में ऐसा कहता है। @ एलेक्स शेल = सच को एक सुरक्षा जोखिम माना जाता है जब अविश्वासित डेटा को संसाधित करने के लिए उपयोग किया जाता है। एक चतुर हमलावर इनपुट को मनमाना सिस्टम कमांड तक पहुँचाने के लिए संशोधित कर सकता है। filename.swf; rm -rf /फ़ाइल नाम के मूल्य के लिए इनपुट करके । हालाँकि, यह केवल एक समस्या है, जब पोपेन के लिए आपके तर्क की सामग्री असुरक्षित है।
हंस तत्पश्चात

10
@ लुकास ग्राफ कोड खंड से मैं दृढ़ता से संदेह करता हूं कि एक उदाहरण मूल्य के रूप में था, जो अविश्वसनीय उपयोगकर्ता द्वारा दिए गए डेटा द्वारा भरा जाना है। लेकिन मैं उस आइटम पर ट्रूस को कॉल करने के लिए तैयार हूं। मेरा कहना और था कि अविश्वासित इनपुट shell=Trueका उपयोग करने के अलावा उपयोग न करने का कोई कारण नहीं है । केवल यह कहते हुए कि सिफारिश नहीं की गई है भ्रामक है। shell=True
हंस तत्पश्चात

7
@ हंस: पीएस मुझे गलत मत समझो, मैं यहां आपके मामले में आने की कोशिश नहीं कर रहा हूं। यह सिर्फ इतना है कि आप इसमें शामिल जोखिमों के बारे में जानते हैं shell=True, लेकिन इस सवाल का कोई भी यादृच्छिक उपयोगकर्ता ठोकर नहीं खा सकता है। इसलिए मुझे लगता है कि यह उजागर करना महत्वपूर्ण है कि shell=Trueवास्तव में अनुशंसित नहीं है, जब तक कि आपको पता नहीं है कि आप वास्तव में क्या कर रहे हैं।
लुकास ग्राफ ने

4
@ ब्लेंडर ने कहा कि यह हानिकारक था - यह केवल खतरनाक है। लेकिन इससे अलग, आपके तर्क का कोई मतलब नहीं है। कई ओएस फ़ंक्शन जो पायथन मानक पुस्तकालय को उजागर करते हैं, संभावित रूप से खतरनाक हैं - shutil.rmtreeउदाहरण के लिए। लेकिन इससे कोई लेना-देना नहीं है कि उन्हें स्टैडलिब में शामिल किया गया है या नहीं। मेरा मानना ​​है कि यूनिक्स का दर्शन "यूनिक्स को मूर्खतापूर्ण काम करने से रोकने के लिए नहीं बनाया गया था, क्योंकि यह उन्हें चतुर चीजें करने से भी रोक देगा।" पायथन के बड़े हिस्से में भी लागू होता है।
लुकास ग्राफ

9

श का उपयोग करें , यह चीजों को बहुत आसान बना देगा:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")

2
श, यह अच्छा है, हालांकि यह सबप्रोन के पोपेन के साथ समान नहीं है। श सबप्रोसेस की कॉल के साथ एक जैसा है।
liuyang1

-1

सबसे आसान तरीके से उपप्रकार का उपयोग !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.