Cara menggunakan subprocess popen Python

102

Karena os.popen digantikan oleh subprocess.popen, saya bertanya-tanya bagaimana cara mengonversi

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

ke subprocess.popen ()

Saya mencoba:

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

Tapi saya rasa saya tidak menuliskan ini dengan benar. Bantuan apa pun akan dihargai. Terima kasih

Stupid.Fat.Cat
sumber
1
Apakah ini Mesin Windows atau mesin Linux?
AAI

Jawaban:

141

subprocess.Popen mengambil daftar argumen:

from subprocess import Popen, PIPE

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

Bahkan ada bagian dari dokumentasi yang dikhususkan untuk membantu pengguna bermigrasi dari os.popenke subprocess.

Blender
sumber
18
@HansThen shell=Trueini tidak dianjurkan.
Pierre GM
7
@Lukas Graf Karena dikatakan demikian dalam kode. @Alex shell = True dianggap sebagai risiko keamanan saat digunakan untuk memproses data yang tidak tepercaya. Penyerang yang cerdas dapat mengubah masukan untuk mengakses perintah sistem yang berubah-ubah. Misal dengan memasukkan filename.swf; rm -rf /nilai nama file. Namun, ini hanya masalah, ketika isi argumen Anda ke Popen tidak aman.
Hans Kemudian
10
@Lukas Graf Dari fragmen kode tersebut saya sangat meragukan bahwa yang dimaksudkan sebagai nilai contoh, diisi oleh data yang diberikan oleh pengguna yang tidak terpercaya. Tapi saya siap untuk melakukan gencatan senjata pada item itu. Maksud saya lebih dari itu tidak ada alasan untuk tidak menggunakan shell=Truekecuali saat menggunakan input yang tidak tepercaya . Menyatakan hal shell=Trueitu tidak disarankan saja sudah menyesatkan.
Hans Kemudian
7
@HansThen: PS Jangan salah paham, saya tidak mencoba menangani kasus Anda di sini. Hanya saja Anda tampaknya menyadari risiko yang terlibat shell=True, tetapi pengguna acak mana pun yang tersandung pada pertanyaan ini mungkin tidak. Itulah mengapa menurut saya penting untuk menyoroti bahwa shell=Truesebenarnya tidak disarankan, kecuali Anda tahu persis apa yang Anda lakukan.
Lukas Graf
4
@ Blender Tidak ada yang mengatakan itu berbahaya - itu hanya berbahaya. Namun selain itu, argumen Anda sama sekali tidak masuk akal. Banyak fungsi OS yang diekspos oleh pustaka standar Python berpotensi berbahaya - ambil shutil.rmtreecontoh. Tapi itu tidak ada hubungannya dengan apakah mereka termasuk dalam stdlib atau tidak. Saya percaya filosofi UNIX tentang "Unix tidak dirancang untuk menghentikan penggunanya melakukan hal-hal bodoh, karena itu juga akan menghentikan mereka melakukan hal-hal pintar." juga berlaku sebagian besar untuk Python.
Lukas Graf
9

Gunakan sh , itu akan membuat segalanya lebih mudah:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
amoffat
sumber
2
sh, itu bagus, namun tidak sama dengan Popen subproses. sh sama dengan panggilan subproses.
liuyang1
-1

Menggunakan Subproses dengan cara termudah !!

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