2011-01-13 49 views
9

Tôi có một tập lệnh Perl mà tôi muốn gọi từ tập lệnh Python. Tôi đã được tìm kiếm trên tất cả, và đã không thành công. Tôi về cơ bản đang cố gắng gọi cho kịch bản Perl gửi 1 biến cho nó, nhưng không cần đầu ra của kịch bản Perl, vì nó là một chương trình tự chứa.Gọi tập lệnh Perl từ Python

Những gì tôi đã đi lên với cho đến nay là:

var = "/some/file/path/" 
pipe = subprocess.Popen(["./uireplace.pl", var], stdin=subprocess.PIPE) 
pipe.stdin.write(var) 
pipe.stdin.close() 

Chỉ vừa mới bắt đầu lập trình Python, vì vậy tôi chắc chắn ở trên là tổng vô nghĩa. Bất kì sự trợ giúp nào đều được đánh giá cao.

Trả lời

7

Nếu bạn chỉ muốn mở một đường ống để một thông dịch perl, bạn đi đúng hướng. Điều duy nhất tôi nghĩ rằng bạn đang bỏ lỡ là kịch bản perl chính nó không phải là một thực thi. Vì vậy, bạn cần phải làm điều này:

var = "/some/file/path/" 
pipe = subprocess.Popen(["perl", "./uireplace.pl", var], stdin=subprocess.PIPE) 
pipe.stdin.write(var) 
pipe.stdin.close() 
+0

phần '. /' Trong cuộc gọi script là vô ích và tôi không thể thấy việc sử dụng hai dòng cuối cùng, và hai dòng cuối cùng này có thể dẫn đến lỗi !! – mouad

+0

Nếu bạn đang cung cấp đường dẫn tuyệt đối và thực thi perl thì ./ không được sử dụng. –

1

Tôi hy vọng this có thể giúp bạn. Không biết làm thế nào để làm điều đó nếu không.

+0

cảm ơn bạn đã tham khảo ... nó đã được tạo và hỗ trợ bởi activestate .. có vẻ như đã bỏ qua? – Tagar

1

Bạn có muốn chuyển var làm tham số, trên stdin hoặc cả hai? Để vượt qua nó như một tham số, sử dụng

subprocess.call(["./uireplace.pl", var]) 

để ống nó vào stdin, sử dụng

pipe = subprocess.Popen("./uireplace.pl", stdin=subprocess.PIPE) 
pipe.communicate(var) 

Cả hai đoạn mã yêu cầu uireplace.pl được thực thi. Nếu không, bạn có thể sử dụng

pipe = subprocess.Popen(["perl", "./uireplace.pl"], stdin=subprocess.PIPE) 
pipe.communicate(var) 
2

Bạn có thể thử phương thức subprocess.call(). Nó sẽ không trả về kết quả đầu ra từ lệnh mà bạn đang gọi, mà đúng hơn là mã trả về để cho biết nếu thực hiện thành công.

var = "/some/file/path" 
retcode = subprocess.call(["./uireplace.pl", var]) 
if retcode == 0: 
    print("Passed!") 
else: 
    print("Failed!") 

Đảm bảo rằng bạn đang thực thi tập lệnh Perl. Nếu không, bạn có thể bao gồm các thông dịch Perl trong lệnh của bạn (một cái gì đó như thế này):

subprocess.call(["/usr/bin/perl", "./uireplace.pl", var]) 
15

Chỉ cần làm:

var = "/some/file/path/" 
pipe = subprocess.Popen(["perl", "uireplace.pl", var]) 
+1

Chỉ cần một lưu ý: kể từ khi OP nói rằng anh ta không muốn có được đầu ra, 'Popen' là không cần thiết. Sử dụng 'subprocess.call' hoặc' subprocess.check_call' là tốt hơn. – user225312

+3

@sukhbir: tôi nghĩ rằng khi OP nói rằng anh ta không cần đầu ra, tôi cũng có thể "giả định" rằng anh ta cũng không muốn đợi cho đến khi kết thúc kịch bản perl mà 'subprocess.call' hoặc' subprocess. check_call' không :) – mouad

+0

Điểm thực sự hợp lệ, +1. – user225312

Các vấn đề liên quan