如何 运行 使用 python 脚本的终端命令,它是通过 wsgi 进程持有的?
How to run a terminal command using python script, which is held through wsgi process?
我有一个带有 cPanel 的 Centos 7 服务器,我正在开发一个 Telegram 机器人来满足我的业务需求。机器人应该能够 运行 使用 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 方法工作一样好。
如果你想从 flask 内部 运行 外部脚本,你可以使用 subprocess 从命令行 运行 脚本。这是正确的解决方案。
@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())
玩得开心!
@Bogdan Kozlowskyi
是否可以在命令行上进行管道传输?您需要 return 给用户一个结果吗?
cmd = 'first_cmd | tee report.log'
result = subprocess.check_output(cmd, cwd='<your wordir>', shell=True)
也许您应该查找 shell 命令,例如“>>”、“>”和 'tee'。
我想我弄错了。您的脚本将报告写入特定目录。您的申请途径不需要结果。
我编写了一个名为 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" 目录。
在浏览器中出现 "It works!"。
希望我能帮到你,否则我真的不知道你想做什么。
似乎是用户组权限问题(执行和写入)。
我有一个带有 cPanel 的 Centos 7 服务器,我正在开发一个 Telegram 机器人来满足我的业务需求。机器人应该能够 运行 使用 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 方法工作一样好。
如果你想从 flask 内部 运行 外部脚本,你可以使用 subprocess 从命令行 运行 脚本。这是正确的解决方案。
@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())
玩得开心!
@Bogdan Kozlowskyi
是否可以在命令行上进行管道传输?您需要 return 给用户一个结果吗?
cmd = 'first_cmd | tee report.log'
result = subprocess.check_output(cmd, cwd='<your wordir>', shell=True)
也许您应该查找 shell 命令,例如“>>”、“>”和 'tee'。
我想我弄错了。您的脚本将报告写入特定目录。您的申请途径不需要结果。
我编写了一个名为 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" 目录。 在浏览器中出现 "It works!"。
希望我能帮到你,否则我真的不知道你想做什么。
似乎是用户组权限问题(执行和写入)。