Как запустить строку кода php из Python?

Я согласен с ответом от zacherates.

Но вы можете сделать вызов intern () в ваших нелиберальных строках.

Из примера zacherates:

// ... but they are not the same object
new String("test") == "test" ==> false 

Если вы ставите нелитеральное равенство строки, это правда

new String("test").intern() == "test" ==> true 
1
задан Rob Kwasowski 10 March 2019 в 00:07
поделиться

2 ответа

[РЕДАКТИРОВАТЬ]

Использовать php -r "code" с подпроцессом . Откройте :

def php(code):
    p = subprocess.Popen(["php", "-r", code],
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out = p.communicate() #returns a tuple (stdoutdata, stderrdata)
    if out[1] != b'': raise Exception(out[1].decode('UTF-8'))
    return out[0].decode('UTF-8')

code = """ \
  $a = ['a', 'b', 'c'][2]; \
  echo($a);"""
print(php(code))

[Оригинальный ответ]

Я нашел [ 115] простой класс , который позволяет вам сделать это.
Код не требует пояснений. Класс содержит 3 метода:

  • get_raw (self, code): для данного блока кода вызовите код и верните необработанный результат в виде строки
  • get (self , code): учитывая блок кода, который генерирует json, вызовите код и интерпретируйте результат как значение Python.
  • get_one (self, code): учитывая блок кода, который генерирует несколько значений json (по одному в строке), выведите следующее значение.

Пример, который вы написали, будет выглядеть следующим образом:

php = PHP()
code = """ \
  $a = ['a', 'b', 'c'][0]; \
  echo($a);"""
print (php.get_raw(code))

Вы также можете добавить префикс и постфикс к коду с помощью PHP(prefix="",postfix"")

PS .: Я изменил оригинальный класс, потому что popen2 устарела. Я также сделал код совместимым с Python 3. Вы можете получить его здесь :

import json
import subprocess

class PHP:
    """This class provides a stupid simple interface to PHP code."""

    def __init__(self, prefix="", postfix=""):
        """prefix = optional prefix for all code (usually require statements)
        postfix = optional postfix for all code
        Semicolons are not added automatically, so you'll need to make sure to put them in!"""
        self.prefix = prefix
        self.postfix = postfix

    def __submit(self, code):
        code = self.prefix + code + self.postfix
        p = subprocess.Popen(["php","-r",code], shell=True,
                  stdin=subprocess.PIPE, stdout=subprocess.PIPE)
        (child_stdin, child_stdout) = (p.stdin, p.stdout)
        return child_stdout

    def get_raw(self, code):
        """Given a code block, invoke the code and return the raw result as a string."""
        out = self.__submit(code)
        return out.read()

    def get(self, code):
        """Given a code block that emits json, invoke the code and interpret the result as a Python value."""
        out = self.__submit(code)
        return json.loads(out.read())

    def get_one(self, code):
        """Given a code block that emits multiple json values (one per line), yield the next value."""
        out = self.__submit(code)
        for line in out:
            line = line.strip()
            if line:
                yield json.loads(line)
0
ответ дан Victor Val 10 March 2019 в 00:07
поделиться

Исходя из ответа Виктора Вала, вот моя собственная компактная версия.

import subprocess

def run(code):
    p = subprocess.Popen(['php','-r',code], stdout=subprocess.PIPE)
    return p.stdout.read().decode('utf-8')

code = """ \
  $a = ['a', 'b', 'c'][0]; \
  echo($a);"""
print(run(code))
0
ответ дан Rob Kwasowski 10 March 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: