Я согласен с ответом от zacherates.
Но вы можете сделать вызов intern () в ваших нелиберальных строках.
Из примера zacherates:
// ... but they are not the same object
new String("test") == "test" ==> false
Если вы ставите нелитеральное равенство строки, это правда
new String("test").intern() == "test" ==> true
[РЕДАКТИРОВАТЬ]
Использовать 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 метода:
blockquote>
- 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)
Исходя из ответа Виктора Вала, вот моя собственная компактная версия.
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))