2015-04-20 2 views
0

Я понимаю, что есть вопросы, подобные моим уже задаваемым, но я не могу понять это даже с ответами на эти вопросы.PHP-переменная в Python

PHP:

<?php 
$var1 = "hi"; 
$result = shell_exec('TestingStuff.py'.$var1); 
?> 

Python: получил

import sys 

print(sys.argv[1]) 

Ошибка при работе в Python:

IndexError: list index out of range 

Оба скрипта находятся в одной и той же папке.

Не могли бы вы предоставить ответ с изменениями кода?

+1

Я не уверен, что вы подразумеваете под «оба сценария находятся в одном файле». У вас есть один текстовый файл, где вы хотите, чтобы его части были php, а части - python? Кроме того, я думаю, вам нужно пространство после TestingStuff.py в строке 'shell_exec' –

+0

@EricRenouf Apologies - я имею в виду« папку ». Где вы имеете в виду пробел? – AmIA

+0

'shell_exec ('TestingStuff.py'. $ Var1)' –

ответ

2

Ошибка

Если сценарий Python работает без аргументов вообще, то, что sys.argv[1] индекс находится вне диапазона.

Сценарии

ExecPython.php

<?php 
$var1 = "hi"; 
$result = shell_exec('TestingStuff.py ' . $var1); 

echo "<pre>$result</pre>"; 

TestingStuff.py

import sys 

if len(sys.argv) > 1: 
    print(sys.argv[1]) 

Демонстрационные

enter image description here

Объяснение

  1. Начнем с сценария Python. Цель состоит в том, что сценарий печатает первый переданный ему аргумент - без использования ошибки «IndexError: list index out the range».

    • python TestingStuff.py 123 Мы хотим получить 123.
  2. В Python аргументы, переданные скрипту, находятся в sys.argv. Это список. sys.argv[0] - это всегда имя сценария (здесь TestingStuff.py). Используя приведенный выше пример sys.argv[1], теперь 123.

  3. Обращение с кромками кромок: «без аргументов».

    • python TestingStuff.py

    Это приведет к «IndexError: индекс списка из диапазона» ошибка, потому что вы пытаетесь получить доступ к элементу списка, который не существует. sys.argv[0] - это имя сценария, а sys.argv[1] не установлено, но вы пытаетесь его распечатать, а BAM выдает ошибку.Чтобы избежать ошибки и только распечатать первый аргумент, нам нужно убедиться, что в списке sys.argv содержится более одного элемента (больше, чем имя скрипта). Вот почему я добавил .

    Это означает: напечатать только первый аргумент, если список содержит более одного аргумента.

  4. Теперь мы можем протестировать автономный скрипт Python с аргументами и без них. И переключитесь на PHP-скрипт.

  5. Целью является выполнение скрипта Python с PHP.

    PHP предоставляет несколько способов выполнения скрипта, например, exec(), passthru(), shell_exec(), system(). Здесь мы используем shell_exec(). shell_exec() возвращает результат скрипта или команды, которую мы запускаем с ним.

    Другими словами: если вы запустите $result = shell_exec('php -v');, вы получите строки версии PHP в $ result.

    Здесь мы выполняем скрипт Python TestingStuff.py и добавляем аргумент $var1. Это строка и добавляется путем конкатенации в строку, заданную для shell_exec(). Отображается $result. Я обернул вокруг него предварительные теги, потому что я думал, что это выполняется в контексте веб-браузера. Если вы используете скрипты только в CLI, вы можете удалить предварительные теги.

Выполнение потока

  • РНР скрипт выполняется
  • shell_exec() выполняет скрипт Python
  • shell_exec() возвращает результат сценария Python как $result
  • $ result печатается PHP через echo
+1

Ничего не выводит. Есть ли способ, который я могу конкретно ссылаться на php-файл в моем сценарии python? – AmIA

+0

Бросьте 'print (sys.argv)' in, чтобы увидеть полный список аргументов на стороне Python. Я добавил echo $ result на стороне PHP, чтобы отобразить вывод shell_exec. –

+0

Без изменений. При печати 'print (sys.argv)' I get: '['C: /actual/TestingStuff.py']' – AmIA

Смежные вопросы