Cách sử dụng quy trình con popen Python


102

Vì os.popen đang được thay thế bằng subprocess.popen, tôi đã tự hỏi làm cách nào để chuyển đổi

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

thành subprocess.popen ()

Tôi đã thử:

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

Nhưng tôi đoán là tôi viết ra điều này không đúng. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn


1
Đây là máy Windows hay máy Linux?
AAI,

Câu trả lời:


141

subprocess.Popen lấy một danh sách các đối số:

from subprocess import Popen, PIPE

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

Thậm chí còn có một phần của tài liệu dành để giúp người dùng di chuyển từ os.popensang subprocess.


18
@HansThen shell=Truekhông khuyến khích.
Pierre GM

7
@Lukas Graf Vì nó nói như vậy trong mã. @Alex shell = True được coi là một rủi ro bảo mật khi được sử dụng để xử lý dữ liệu không đáng tin cậy. Kẻ tấn công thông minh có thể sửa đổi đầu vào để truy cập các lệnh hệ thống tùy ý. Ví dụ: bằng cách nhập filename.swf; rm -rf /giá trị của tên tệp. Tuy nhiên, đây chỉ là một vấn đề, khi nội dung tranh luận của bạn với Popen không an toàn.
Hans Then

10
@Lukas Graf Từ đoạn mã, tôi thực sự nghi ngờ rằng nó có nghĩa là một giá trị mẫu, được lấp đầy bởi dữ liệu do người dùng cung cấp không đáng tin cậy. Nhưng tôi chuẩn bị kêu gọi đình chiến đối với mặt hàng đó. Quan điểm của tôi là không có lý do gì để không sử dụng shell=Truengoại trừ khi sử dụng đầu vào không đáng tin cậy . Chỉ đơn giản nói rằng shell=Truekhông được khuyến khích là gây hiểu lầm.
Hans Then

7
@HansThen: PS Đừng hiểu sai ý tôi, tôi không cố lấy trường hợp của bạn ở đây. Chỉ là bạn dường như nhận thức được những rủi ro liên quan shell=True, nhưng bất kỳ người dùng ngẫu nhiên nào tình cờ gặp câu hỏi này có thể không. Đó là lý do tại sao tôi nghĩ điều quan trọng là phải làm nổi bật rằng shell=Truethực tế không được khuyến khích, trừ khi bạn biết chính xác mình đang làm gì.
Lukas Graf

4
@Blender Không ai nói nó có hại - nó chỉ đơn thuần là nguy hiểm. Nhưng ngoài điều đó, lập luận của bạn chẳng có ý nghĩa gì cả. Nhiều chức năng hệ điều hành mà thư viện chuẩn Python thể hiện có khả năng nguy hiểm - lấy shutil.rmtreeví dụ. Nhưng điều đó không liên quan gì đến việc chúng có được đưa vào stdlib hay không. Tôi tin rằng triết lý của UNIX về "Unix không được thiết kế để ngăn người dùng của mình làm những điều ngu ngốc, vì điều đó cũng sẽ ngăn họ làm những điều thông minh." cũng áp dụng cho Python.
Lukas Graf

9

Sử dụng sh , nó sẽ làm mọi thứ dễ dàng hơn rất nhiều:

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

2
sh, nó tốt, tuy nhiên nó không giống với Popen của quy trình con. sh cũng giống như lệnh gọi của quy trình con.
liuyang1

-1

Sử dụng Subprocess một cách dễ dàng nhất !!

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

Tránh sử dụng shell=Truevà thay vào đó chuyển một danh sách các đối số (ví dụ. subprocess.call(['pip', 'install', 'numpy'])). shell=Truekhông an toàn với đầu vào người dùng cung cấp (người dùng có thể chạy bất kỳ lệnh tùy ý nếu họ kiểm soát một cuộc tranh cãi), và khó khăn hơn để sử dụng do bao quy tắc trích dẫn.
Chris Warrick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.