Gọi Python bằng PHP


82

Tôi có một tập lệnh Python mà tôi đã viết gần đây mà tôi gọi bằ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 mình.

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 chỉ định tạo hệ thống () hoặc popen () từ PHP để gọi tập lệnh Python.

Bất kỳ ý tưởng tốt hơn? Cảm ơn trước!

Câu trả lời:


106

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 trực tiếp đến trình duyệt. Sử dụng popen () nếu bạn muốn ghi dữ liệu vào đầu vào chuẩn của tập lệnh Python hoặc đọc dữ liệu từ đầu ra chuẩn của tập lệnh Python trong php. popen () sẽ chỉ cho phép bạn đọc hoặc viết chứ không cho phép 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 phải cẩn thận để tránh bế tắc, trong đó mỗi chương trình đang chờ chương trình kia làm điều gì đó.

Nếu bạn muốn chuyển dữ liệu do người dùng cung cấp sang tập lệnh Python, thì điều quan trọng cần cẩn thận là chèn lệnh. 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 hiện các lệnh tùy ý trái với ý muốn của bạn.

Escapehellarg ()hidepeshellcmd () có thể giúp giải quyết vấn đề này, nhưng cá nhân tôi muốn xóa mọi thứ không phải là một nhân vật tốt được biết đến, bằng cách sử dụng một thứ như

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

1
Mô-đun quy trình con đã thay thế bằng cách sử dụng trực tiếp os.Popen [n]. Bạn nên sử dụng nó để thay thế.
Nick Stinemate

6
@Nick Stinemates: Chúng ta đang nói về chức năng PHP;)
Glaslos

không có giải pháp nào KHÔNG liên quan đến một trình bao, giống như hành động của C () ngoại trừ việc nó chạy trên một quy trình riêng biệt thay vì phải fork () trước.
Lie Ryan

Luôn có và luôn có giải pháp nhưng bạn phải chạy python ở đâu đó để lấy thứ gì đó ra khỏi nó. Bạn có thể tạo dịch vụ python đơn giản chỉ chờ đầu vào cho đến khi nó có một số hoặc bạn có thể kích hoạt bạn lập trình bằng cách nào đó (ví dụ: inotify linux), sau đó có các phần mở rộng PHP đó và sau đó là các ổ cắm cục bộ cho máy chủ linux. Python trong PHP trông giống như giải pháp NoShell tốt nhất vì các phần mềm khác (không phải plugin) sẽ luôn có một số loại shell xung quanh python của bạn.
Sampo Sarrala - codidact.org

27

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

Trong một tệp python có tên là python.py:

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

Trong một tệp php có tên là python.php:

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

15

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


11
Cần lưu ý rằng tên "pip" cũng được sử dụng để mô tả công cụ quản lý gói Python cực kỳ phổ biến và khá chuẩn, vì vậy đây là một cái tên thực sự tồi tệ, khó hiểu và cam chịu cho công cụ PHP này. Có lẽ đó là lý do tại sao nó không được cập nhật quá lâu.
GregD,

2
Trông giống như nó vẫn đi (sans tên người nghèo lựa chọn) github.com/jparise/php-python
benekastah

11

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

Về cơ bản, bạn phải gọi tập lệnh 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.sleep () trong mã python, nó sẽ không xuất kết quả trên trình duyệt.

Để có 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


Cách xác định đường dẫn ở đây là tương đối và tuyệt đối. Về cơ bản, tôi có tập lệnh python của mình trong thư mục let say tempmonvà cùng một thư mục chứa tập lệnh python của tôi. Tôi muốn ứng dụng có thể di động để có thể sao chép tempmonthư mục bên dưới htdocs. Và điều tương tự sẽ hoạt động trên các máy khác nhau.
Krishna Oza

Làm việc hoàn hảo. Bạn có thể thêm thẻ php mở và đóng <? Php?> Để hiểu rõ hơn cho người mới bắt đầu
Zaheer

7

Tôi làm việc này mọi lúc cho những script nhanh và bẩn. Khá phổ biến khi 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 hết sức cẩn thận nếu máy chủ web của bạn được mở với Internet. Đảm bảo khử trùng đầ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.


3

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

<?php
    $item='Everything is awesome!!';
    $tmp = exec("py.py $item");
    echo $tmp;
?>

Thao tác này thực thi tập lệnh python và xuất kết quả cho trình duyệt. 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 mà php của bạn đang kéo từ đó nếu bạn muốn thực hiện một vùng văn bản:

import sys

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

def main():
  print list1

if __name__ == '__main__':
    main()

0

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


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 làm tài liệu tham khảo.

Tôi có hai tệp này

run.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.

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
    if(isset($_POST['GO']))
    {
        shell_exec("python /var/www/html/lab/mkdir.py");
        echo"success";
    }
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");

-2

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

exec('your script python.py')

a) Dấu cách các tham số riêng biệt, tức là điều này cố gắng gọi chương trình yourvới các tham số scriptpython.py. b) Trừ khi tập lệnh Python có một shebang thích hợp, người ta phải gọi trình thông dịch Python và chuyển tên tập lệnh cho nó ( python script.py). Ngay cả với một shebang thích hợp, điều này vẫn sai như khi bạn gọi ./script.pythay vì sử dụng tên thông dịch viên.
Tox
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.