如何使用通过wsgi进程保存的python脚本运行终端命令?

时间:2019-03-24 07:03:31

标签: apache flask centos cpanel wsgi

我有一台具有cPanel的Centos 7服务器,并且我正在为满足我的业务需求而使用Telegram机器人。该bot应该能够通过os.system或subprocess.Popen运行终端命令,但是通过webhook + wsgi进程进行配置时,这两个选项均不起作用。

我同时使用bot.polling方法进行了测试,并且它们都具有吸引力,但是当我切换到flask和wsgi服务的webhook方法之后,两者都不再为我工作。我尝试了以下方法:

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 :(得分:0)

如果要从flask内部运行外部脚本,可以使用子进程从命令行运行脚本。这是正确的解决方案。

@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())

玩得开心!

答案 1 :(得分:0)

@Bogdan Kozlowskyi

是否可以通过命令行进行管道传输?您需要将结果返回给用户吗?

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

也许您应该寻找像'>>','>'和'tee'这样的shell命令。

答案 2 :(得分:0)

我认为我做错了。您的脚本将报告写入特定目录。您的申请路线不需要任何结果。

我编写了一个名为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”目录。 在浏览器中显示“它有效!”。

希望我能为您提供帮助,或者我对您要做什么一无所知。

答案 3 :(得分:0)

似乎是用户组权限问题(执行和写入)。