কীভাবে সাবপ্রসেস পপেন পাইথন ব্যবহার করবেন


102

যেহেতু os.popen subprocess.popen দ্বারা প্রতিস্থাপিত হচ্ছে, আমি ভাবছিলাম কীভাবে আমি রূপান্তর করব

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

সাবপ্রসেস.পোপেন ()

আমি চেষ্টা করেছিলাম:

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
@HansThen shell=Trueহয় না সুপারিশ করেন।
পিয়েরে জিএম

7
@ লুকাস গ্রাফ যেহেতু কোডে এটি তাই বলে। @ অ্যালেক্স শেল = অবিশ্বস্ত ডেটা প্রক্রিয়া করার জন্য সত্যটিকে সুরক্ষা ঝুঁকি হিসাবে বিবেচনা করা হয়। একটি চালাক আক্রমণকারী স্বেচ্ছাসেবী সিস্টেম কমান্ড অ্যাক্সেস করতে ইনপুটটি পরিবর্তন করতে পারে। যেমন filename.swf; rm -rf /ফাইলের নামের জন্য ইনপুট করে । যাইহোক, এটি কেবল তখনই সমস্যা, যখন আপনার পপেনের পক্ষে যুক্তির বিষয়বস্তুগুলি অনিরাপদ।
হান্স তারপরে

10
@ লুকাস গ্রাফ কোড টুকরা থেকে আমি দৃ strongly়ভাবে সন্দেহ করি যে অবিশ্বস্ত ব্যবহারকারী সরবরাহিত ডেটা দ্বারা পূরণ করা, উদাহরণস্বরূপ মান হিসাবে বোঝানো হয়েছিল। তবে আমি সেই আইটেমটির উপর একটি ট্রুস করতে প্রস্তুত। আমার বক্তব্যটি আরও ছিল যে অবিশ্বস্ত ইনপুট ব্যবহার করা shell=Trueছাড়া ব্যবহার করার কোনও কারণ নেই । কেবলমাত্র যা বলা বাঞ্ছনীয় তা বিভ্রান্তিকর। shell=True
হান্স তারপরে

7
@ হ্যান্সথেন: পিএস আমাকে ভুল করবেন না, আমি এখানে আপনার মামলা করার চেষ্টা করছি না। এটি কেবল যে আপনি ঝুঁকির সাথে জড়িত সম্পর্কে সচেতন বলে মনে হচ্ছে shell=Trueতবে এই প্রশ্নটি জুড়ে যে কোনও এলোমেলো ব্যবহারকারীর হোঁচট খাচ্ছে না। এই কারণেই আমি হাইলাইট করা জরুরী মনে করি যে shell=Trueবাস্তবে প্রস্তাবিত নয়, আপনি কী করছেন ঠিক তা না জানলে।
লুকাশ গ্রাফ

4
@ ব্লেন্ডার কেউ বলেনি এটি ক্ষতিকারক - এটি কেবল বিপজ্জনক। তবে সেগুলি বাদ দিয়ে আপনার যুক্তি মোটেই বোঝা যায় না। পাইথন স্ট্যান্ডার্ড লাইব্রেরিটি বহন করে এমন অনেকগুলি ওএস ফাংশন সম্ভাব্য বিপজ্জনক - shutil.rmtreeউদাহরণস্বরূপ নিন। তবে তারা স্টাডলিবের অন্তর্ভুক্ত কিনা তা নিয়ে তাদের কোনও সম্পর্ক নেই। আমি বিশ্বাস করি যে ইউনিক্স দর্শন "ইউনিক্স এর ব্যবহারকারীদের বোকা কাজ করা থেকে বিরত করার জন্য ডিজাইন করা হয়নি, কারণ এটি তাদের চালাক জিনিসগুলি থেকে বিরত রাখতে পারে।" পাইথনে বড় অংশেও প্রযোজ্য।
লুকাস গ্রাফ

9

Sh ব্যবহার করুন , এটি জিনিসগুলি অনেক সহজ করে তুলবে:

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

2
sh, এটি ভাল, তবে সাব-প্রসেসের পপেনের সাথে এটি একই নয়। উপ-প্রসেসের কল দিয়ে sh একই রকম।
liuyang1

-1

সহজ উপায়ে সাবপ্রসেস ব্যবহার করা !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)

shell=Trueযুক্তিগুলির তালিকা (উদাহরণস্বরূপ subprocess.call(['pip', 'install', 'numpy'])) ব্যবহার করা এবং পরিবর্তে এড়িয়ে চলুন । shell=Trueহয় অনিরাপদ আরো কঠিন ব্যবহারকারী প্রদত্ত ইনপুট (যদি তারা একটি আর্গুমেন্ট নিয়ন্ত্রণ ব্যবহারকারী কোনো অবাধ কমান্ড চালাতে পারেন) সঙ্গে, এবং মূল্য উদ্ধৃতি নিয়ম শেল কারণে ব্যবহার করতে।
ক্রিস ওয়ারিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.