Может ли Apache запустить скрипт Python, который НЕ является исполняемым? - PullRequest
0 голосов
/ 12 октября 2018

Я установил Ubuntu server 18.04 LTS, LAMP и mod_mono (который, между прочим, теперь работает нормально вместе с PHP.) У меня тоже работает python;сначала он выдал сообщение HTTP «Внутренняя ошибка сервера».sudo chmod +x myfile.py исправил эту ошибку, и код, сгенерированный питоном, отображается нормально.Но каждый раз, когда разрешение на выполнение удаляется из файла (например, путем загрузки новой версии файла), бит выполнения удаляется и снова прерывается.

Обход был реализован с помощью incrontab, гдепапка cgi-bin отслеживалась на предмет изменений, и любые новые записи приводили к запуску chmod +x %f на них.Это работало некоторое время, затем прекратилось и, в лучшем случае, кажется нелепым решением.Perl, PHP и даже ASPX не должны быть помечены как исполняемые - только python.

Есть ли способ, как Apache может "запустить" python без файла, помеченного как исполняемый?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Я не думаю, что Apache способен обслуживать исполняемые скрипты Python без бита исполнения, установленного в файле .py.

Но здесь есть обходной путь: просто оставьте этот файл отмеченным как исполняемый, но import второй файл питона.Этот второй файл не должен быть помечен как исполняемый.

myfile.py (помечен как исполняемый и только для чтения - используйте его с apache):

#!/usr/bin/python3
# enable debugging
# helper to run the other, non-executable file
# do not add .py to the import "filename"
import myfile2

myfile 2 .py (отмечен только RW, редактируйте этот файл свободно):

# this is the code which can change frequently
# and does not need to be marked executable...
print("Content-type: text/html\n\n")
print("<html><head><title>Python</title></head>")
print("<body>Hello, World!</body></html>")
0 голосов
/ 13 октября 2018

Причина, по которой работает PHP, заключается в том, что интерпретатор загружается в Apache.Итак, Apache интерпретирует код.

Для вашего Python он работает как CGI, поэтому интерпретатор находится за пределами Apache.

В вашем скрипте Python у вас, вероятно, есть #!/usr/bin/python первая строка(или что-то подобное).Это говорит сценарию о запуске с использованием этого интерпретатора.Для этого требуется разрешение на выполнение исполняемого файла .py и возможность прямого вызова myfile.py.

Вместо этого запустите его так: /usr/bin/python myfile.py.Таким образом, интерпретатор является исполняемым файлом, и он будет запускать myfile.py в качестве кода.


Примеры

  • Вы хотите запустить py-файл "один"":

    file.py
        #!/usr/bin/python
        print("Hello")
    
    Running it:
        ./file.py
    
  • Вы хотите запустить его через исполняемый файл python, как вы хотите через Apache:

    file.py
        print("Hello")
    
    Running it:
        /usr/bin/python file.py
    
...