2012-01-24 47 views
18

Vì một số lý do, tôi phải chạy một tập lệnh php để lấy một hình ảnh từ Python. Bởi vì kịch bản php là rất lớn và nó không phải là của tôi, nó sẽ đưa tôi ngày để tìm ra các thuật toán đúng được sử dụng và dịch nó thành python.Thực thi mã php bằng Python

Tôi tự hỏi nếu có bất kỳ cách nào để chạy tập lệnh php, với vài tham số, trả về một hình ảnh, trong python.

Trả lời

32

Ví dụ mã:

import subprocess 

# if the script don't need output. 
subprocess.call("php /path/to/your/script.php") 

# if you want output 
proc = subprocess.Popen("php /path/to/your/script.php", shell=True, stdout=subprocess.PIPE) 
script_response = proc.stdout.read() 
+2

Đây là mã được dán từ http://mail.python.org/pipermail/tutor/2009-October/071973.html – Alvin

+7

nó không chính xác. Cuộc gọi đầu tiên sẽ không hoạt động trên các hệ thống POSIX. Sử dụng 'subprocess.call ([" php "," /path/to/your/script.php "])' để thay thế. Sử dụng 'script_response = subprocess.check_output ([" php "," /path/to/your/script.php "])' thay vì ví dụ thứ hai. – jfs

+0

nếu đối số 'shell' được đặt thành' True' thì sử dụng chuỗi chứ không phải danh sách là ok – Valen

5

Bạn có thể chỉ cần thực thi tệp thực thi php từ Python.

Edit: ví dụ cho Python 3.5 trở lên sử dụng subprocess.run:

import subprocess 

result = subprocess.run(
    ['php', 'image.php'], # program and arguments 
    stdout=subprocess.PIPE, # capture stdout 
    check=True    # raise exception if program fails 
) 
print(result.stdout)   # result.stdout contains a byte-string 
+0

Bạn có thể đăng bất kỳ ví dụ? – jiahao

+0

http://mail.python.org/pipermail/tutor/2009-October/071973.html – Sjoerd

+0

Giả sử tập lệnh php có thể được gọi từ dòng lệnh và chấp nhận đối số dòng lệnh để mô tả việc cần làm với hình ảnh bạn có thể sử dụng gói con được xây dựng trong gói con. nhập quy trình con subprocess.call (["/ path/to/php", "/path/to/php/script.php", "đối số"]) –

2

Thực hiện một wrapper xung quanh kịch bản PHP, đó:

  • thực hiện các công cụ (Nếu tôi hiểu tốt, đó là một hình ảnh tạo),
  • rồi chuyển hướng (301 Đã di chuyển vĩnh viễn) sang hình ảnh kết quả,
  • (cũng , hình ảnh sẽ bị xóa một số ngày).

Vì vậy, bạn có thể tham khảo dịch vụ này (kịch bản PHP) với một yêu cầu HTTP đơn giản, từ bất cứ nơi nào, bạn có thể thử nghiệm nó với trình duyệt, sử dụng từ Python PRG, bạn cần chỉ cần tải hình ảnh theo cách thông thường .

Ngoài ra, nếu bạn có một hệ thống phụ độc lập như vậy, đừng cảm thấy xấu về việc triển khai nó bằng ngôn ngữ/kỹ thuật khác nhau. Nó có một số lợi thế, ví dụ: bạn có thể cài đặt dịch vụ đó trên một máy chủ khác.

Đề nghị đọc: Service-Oriented Architecture trên Wikipedia.

+0

Đó là một ý tưởng thực sự tốt! Tôi đoán nó có thể giải quyết vấn đề của tôi. Cảm ơn rất nhiều. – jiahao

2

Nếu bạn có thể chạy tập lệnh PHP cục bộ từ dòng lệnh, subprocess.check_output() sẽ cho phép bạn có thể PHP và sẽ nắm bắt giá trị trả lại.

Nếu bạn đang truy cập PHP qua ổ cắm, bạn có thể sử dụng urllib.urlopen() hoặc urllib.urlretrieve() để kéo tài nguyên xuống.

4

Bạn có thể sử dụng php.py. Điều này sẽ cho phép bạn thực thi mã php trong python, như trong ví dụ này (lấy từ here):

php = PHP("require '../code/private/common.php';") 
code = """for ($i = 1; $i <= 10; $i++) { echo "$i\n"; }""" 
print php.get_raw(code) 
+0

Xin chào. Cảm ơn bạn đã giúp đỡ. Nếu bạn kiểm tra mã nguồn của chương trình này, bạn có thể thấy rằng tôi phải nhập mã php bằng tay. Vì nó cũng được liên kết với một số tệp .inc, nó không phải là lựa chọn tốt như vậy. Nhưng dù gì cũng cảm ơn. – jiahao

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