Hướng dẫn dùng popen python trong PHP

Tôi có một tập lệnh Python gần đây tôi đã viết rằng tôi gọi bằng cách sử dụng dòng lệnh với một số tùy chọn. Bây giờ tôi muốn có một giao diện web rất mỏng để gọi tập lệnh này cục bộ trên máy Mac của tôi.

Tôi không muốn gặp rắc rối nhỏ khi cài đặt mod_python hoặc mod_wsgi trên máy Mac của mình, vì vậy tôi sẽ thực hiện một hệ thống [] hoặc popen [] từ PHP để gọi tập lệnh Python.

Còn ý tưởng nào hay hơn không? Cảm ơn trước!

  • php
  • python

74 hữu ích 0 bình luận 149k xem chia sẻ

answer

100

Tùy thuộc vào những gì bạn đang làm, system [] hoặc popen [] có thể hoàn hảo. Sử dụng system [] nếu tập lệnh Python không có đầu ra hoặc nếu bạn muốn đầu ra của tập lệnh Python đi trực tiếp vào trình duyệt. Sử dụng popen [] nếu bạn muốn ghi dữ liệu vào đầu vào tiêu chuẩn của tập lệnh Python hoặc đọc dữ liệu từ đầu ra tiêu chuẩn của tập lệnh Python trong php. popen [] sẽ chỉ cho phép bạn đọc hoặc viết, nhưng không cho cả hai. Nếu bạn muốn cả hai, hãy kiểm tra Proc_open [] , nhưng với giao tiếp hai chiều giữa các chương trình, bạn cần cẩn thận để tránh bế tắc, trong đó mỗi chương trình đang chờ người kia làm gì đó.

Nếu bạn muốn chuyển dữ liệu do người dùng cung cấp vào tập lệnh Python, thì điều quan trọng nhất là lệnh tiêm. Nếu bạn không cẩn thận, người dùng của bạn có thể gửi cho bạn dữ liệu như "; evilcommand;" và làm cho chương trình của bạn thực thi các lệnh tùy ý trái với ý muốn của bạn.

escapeshellarg []escapeshellcmd [] có thể giúp với điều này, nhưng cá nhân tôi muốn loại bỏ mọi thứ không phải là một nhân vật tốt được biết đến, sử dụng một cái gì đó như

preg_replace['/[^a-zA-Z0-9]/', '', $str]

100 hữu ích 5 bình luận chia sẻ

answer

25

Toán tử backquote cũng sẽ cho phép bạn chạy các kịch bản python bằng cú pháp tương tự như trên

Trong tệp python có tên python.py:

hello = "hello"
world = "world"
print hello + " " + world

Trong tệp php có tên python.php:

$python = `python python.py`;
echo $python;

25 hữu ích 1 bình luận chia sẻ

answer

15

Ngoài ra còn có một phần mở rộng PHP: Pip - Python trong PHP , điều mà tôi chưa bao giờ thử nhưng nó đã được đánh dấu cho một dịp như vậy

15 hữu ích 2 bình luận chia sẻ

answer

11

Bạn có thể chạy tập lệnh python qua php và xuất ra trên trình duyệt.

Về cơ bản, bạn phải gọi kịch bản python theo cách này:

$command = "python /path/to/python_script.py 2>&1";
$pid = popen[ $command,"r"];
while[ !feof[ $pid ] ]
{
 echo fread[$pid, 256];
 flush[];
 ob_flush[];
 usleep[100000];
}
pclose[$pid];

Lưu ý: nếu bạn chạy bất kỳ time.s ngủ [] trong mã python của bạn, nó sẽ không đưa ra kết quả trên trình duyệt.

Để mã đầy đủ hoạt động, hãy truy cập Cách thực thi tập lệnh python từ php và hiển thị đầu ra trên trình duyệt

11 hữu ích 2 bình luận chia sẻ

answer

7

Tôi làm điều này mọi lúc cho các kịch bản nhanh và bẩn. Điều khá phổ biến là có một tập lệnh CGI hoặc PHP chỉ sử dụng system / popen để gọi một số chương trình bên ngoài.

Chỉ cần cẩn thận hơn nếu máy chủ web của bạn mở internet lớn. Hãy chắc chắn vệ sinh đầu vào GET / POST của bạn trong trường hợp này để không cho phép kẻ tấn công chạy các lệnh tùy ý trên máy của bạn.

7 hữu ích 0 bình luận chia sẻ

answer

2

Call_python_file.php của bạn sẽ giống như thế này:

Điều này thực thi kịch bản python và xuất kết quả cho trình duyệt. Trong khi trong tập lệnh python của bạn, biến [sys.argv [1:]] sẽ mang lại tất cả các đối số của bạn. Để hiển thị argv dưới dạng một chuỗi cho bất cứ nơi nào php của bạn được kéo từ đó nếu bạn muốn làm một vùng văn bản:

import sys

list1 = ' '.join[sys.argv[1:]]

def main[]:
  print list1

if __name__ == '__main__':
    main[]

2 hữu ích 0 bình luận chia sẻ

answer

0

Lưu ý rằng nếu bạn đang sử dụng một môi trường ảo [như trong lưu trữ được chia sẻ] thì bạn phải điều chỉnh đường dẫn của mình đến python, ví dụ: /home/user/mypython/bin/python ./cgi-bin/test.py

0 hữu ích 0 bình luận chia sẻ

answer

0

Các phương pháp trên có vẻ phức tạp. Sử dụng phương pháp của tôi như một tài liệu tham khảo.

Tôi có hai tập tin này

chạy.php

mkdir.py

Ở đây, tôi đã tạo một trang html có chứa nút GO. Bất cứ khi nào bạn nhấn nút này, một thư mục mới sẽ được tạo trong thư mục có đường dẫn bạn đã đề cập.

chạy.php


 
  
   
     run
   
  

   

    
   
 


mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs["thisfolder"];

0 hữu ích 0 bình luận chia sẻ

answer

1

Nếu bạn muốn thực thi tập lệnh Python của mình trong PHP, thì cần phải thực hiện lệnh này trong tập lệnh php của bạn:

exec['your script python.py']

1 hữu ích 0 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Chủ Đề