Выполнить php-код в Python

20

По какой-то причине я должен запустить php-скрипт, чтобы получить изображение с Python. Поскольку скрипт php очень большой, и он не мой, мне потребуется несколько дней, чтобы узнать правильный алгоритм и перевести его в python.

Мне интересно, есть ли способ запустить php-скрипт с несколькими параметрами, которые возвращают изображение, в python.

    
задан jiahao 24.01.2012 в 10:12
источник

5 ответов

33

Пример кода:

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()
    
ответ дан xdazz 24.01.2012 в 10:29
источник
  • Это код, вставленный с mail.python.org/pipermail/tutor/2009-October/071973.html –  Alvin 29.07.2012 в 21:22
  • неверно. Первый вызов не будет работать в системах POSIX. Вместо этого используйте subprocess.call (["php", "/path/to/your/script.php"]). Используйте сценарий_response = subprocess.check_output (["php", "/path/to/your/script.php"]) вместо второго примера. –  jfs 29.10.2014 в 17:34
  • , если для оболочки аргумента установлено значение Истина, тогда использование строки, а не списка, в порядке –  Valen 22.07.2017 в 09:06
6

Вы можете просто выполнить исполняемый файл php из Python.

Изменить: пример для Python 3.5 и выше с помощью 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
    
ответ дан Sjoerd 24.01.2012 в 10:15
источник
  • Можете ли вы опубликовать любой пример? –  jiahao 24.01.2012 в 10:21
  • mail.python.org/pipermail/tutor/2009-October/071973.html –  Sjoerd 24.01.2012 в 10:24
  • Предполагая, что скрипт php можно вызвать из командной строки и принять аргумент командной строки, чтобы описать, что делать с изображением, вы можете использовать встроенный пакет подпроцесса. import subprocess subprocess.call (["/ path / to / php", "/path/to/php/script.php", "argument"]) –  Rob Young 24.01.2012 в 10:26
  • Опубликовать пример –  tumbleweed 06.03.2017 в 16:01
4

Вы можете использовать php.py . Это позволит вам выполнить php-код в python, как в этом примере (взято из здесь ):

php = PHP("require '../code/private/common.php';")
code = """for ($i = 1; $i <= 10; $i++) { echo "$i\n"; }"""
print php.get_raw(code)
    
ответ дан Wesley 24.01.2012 в 10:36
источник
  • Привет. Спасибо за вашу помощь. Если вы проверите исходный код этой программы, вы увидите, что мне нужно ввести PHP-код вручную. Поскольку он также связан с некоторыми .inc файлами, это не очень хороший вариант. Но все равно спасибо. –  jiahao 24.01.2012 в 11:32
2

Создайте оболочку вокруг скрипта PHP, который:

  • выполняет материал (если я хорошо понимаю, это создание образа),
  • затем перенаправляет ( 301 Перемещено навсегда ) на изображение результата,
  • (также изображение должно быть очищено однажды).

Таким образом, вы можете ссылаться на эту службу (скрипт PHP) с помощью простого HTTP-запроса из любого места, вы можете протестировать его в браузере, использовать с Python prg, вам нужно просто загрузить изображение обычным способом.

Кроме того, если у вас есть такая автономная подсистема, не чувствуйте себя плохо, чтобы реализовать ее с помощью другого языка / техники. Он имеет несколько преимуществ, например. вы можете установить эту службу на другой хост.

Рекомендуемое чтение: сервис-ориентированная архитектура в Википедии.

    
ответ дан ern0 24.01.2012 в 10:22
источник
  • Это действительно хорошая идея! Думаю, это может решить мою проблему. Большое спасибо. –  jiahao 24.01.2012 в 10:30
2

Если вы можете запустить скрипт PHP локально из командной строки, subprocess.check_output () позволит вам PHP и захватить возвращаемое значение.

Если вы обращаетесь к PHP через сокет, вы можете использовать urllib.urlopen () или urllib.urlretrieve () , чтобы вытащить ресурс.

    
ответ дан Raymond Hettinger 24.01.2012 в 10:27
источник