Как запустить терминальную команду, используя скрипт python, который проходит через процесс wsgi? - PullRequest
0 голосов
/ 24 марта 2019

У меня есть сервер Centos 7 с cPanel, и я работаю над ботом Telegram для своих бизнес-потребностей. Бот должен быть в состоянии выполнить команду терминала с os.system или subprocess.Popen, однако оба параметра не работают при настройке через процесс webhook + wsgi.

Я тестировал оба метода bot.polling, и они работали как брелок, однако после того, как я переключился на метод webhook, обслуживаемый flask и wsgi, оба перестали работать для меня. Я пробовал следующее:

mycommand = "python3.6 GoReport.py --id 31-33 --format word"
os.chdir('dir_to_run_command_from')
os.system(mycommand)

и следующий:

mycommand = "python3.6 GoReport.py --id 31-33 --format word"
subprocess.Popen(mycommand, cwd="dir_to_run_command_from", shell=True)

Оба варианта сейчас просто ничего не делают. Я попытался напечатать их обоих и получил 0 в качестве ответа. Интересно, проблема вызвана разрешениями или чем-то другим?

Я ожидаю, что обе опции будут работать через webhook + wsgi так же хорошо, как они работают через метод bot.polling.

Ответы [ 4 ]

0 голосов
/ 24 марта 2019

Кажется, проблема с правами доступа групп пользователей (выполнение и запись).

0 голосов
/ 24 марта 2019

@ Богдан Козловский

Возможно ли пайпить в командной строке? Вам нужно вернуть результат пользователю?

cmd = 'first_cmd | tee report.log'
result = subprocess.check_output(cmd, cwd='<your wordir>', shell=True)

Возможно, вам следует искать такие команды оболочки, как '>>', '>' и 'tee'.

0 голосов
/ 24 марта 2019

Я думаю, что понял неправильно. Ваш скрипт пишет отчет в определенную директорию. Вам не нужен результат в маршруте вашего приложения.

Я написал небольшое тестовое приложение, которое называется tryout. Он работает в виртуальной среде.

$ mkdir tryout
$ cd tryout 
$ python3 -m venv tryout 
$ source tryout/bin/activate
$ export FLASK_APP=tryout/app 
$ export FLASK_ENV=development
$ flask run

Структура каталогов:

/tryout
  /app/*
  /bin/*
  /include/*
  /lib/*
/subdir/*

Применение:

# /tryout/app/__init__.py
import sys, os
from flask import Flask

def create_app(env=os.getenv('FLASK_ENV', 'development')):
    app = Flask(__name__)

    @app.route('/run-script')
    def run_script():
        import subprocess

        cmd = 'python script.py'
        cwd = 'subdir'
        ret = subprocess.check_output(cmd, cwd=cwd, shell=True)
        print(ret)

        return ret, 200

    return app

app = create_app()

Сценарий:

# /subdir/script.py
import os, sys

def main():
    with open('report.txt', 'w+') as fp:
        fp.write('Info\n')

    sys.stdout.write('It works!')

if __name__ == '__main__':
    main()

Это работает! Новый файл с именем «report.log» записывается в каталог «subdir». В браузере появляется сообщение «Это работает!».

Надеюсь, я смогу вам помочь, или у меня нет реального представления о том, что вы хотите сделать.

0 голосов
/ 24 марта 2019

Если вы хотите запустить внешний скрипт из колбы, вы можете использовать подпроцесс для запуска скрипта из командной строки. Это правильное решение.

@app.route('/run-script')
def run_script():
   cmd = '<your command here!>'
   result = subprocess.check_output(cmd, cwd='<your wordir>', shell=True)
   return render_template('results.html', **locals())

Веселись!

...