在Flask应用中使用subprocess.run()需要什么?
即使是一个简单的例子,从 https://docs.python.org/3.6/library/subprocess.html 失败。
process = subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
output = process.stdout
app.logger.info(f"Process output: {output}")
File "./main.py", line 209, in process_pdf
process = subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
File "/usr/lib/python3.6/subprocess.py", line 423, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'ls': 'ls'
Python 3.6.8 (on Ubuntu 18.04LTS)
Flask由uwsgi提供服务(来自nginx)。
我从更复杂的例子开始,尝试使用shell=True和其他参数,但似乎没有什么效果。
当从命令行调用sub.py时,subprocess.run()工作正常。
process = subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
output = process.stdout
print(f"Results {output}")
Results b'crw-rw-rw- 1 root root 1, 3 Nov 28 15:10 /dev/null\n'
在Flask中,我可以使用旧的os.popen,但没有结果。
stream = os.popen('ls -l /dev/null')
output = stream.readlines()
app.logger.info(f"Process output: {output}")
编辑:感谢@furas和@Dursug给我指出了正确的方向。这似乎是www-data缺乏外壳的问题。
那么,什么才是解决这个问题的最Pythonic/Flask方式呢?
PS 我想运行特定的外部程序,如imagemagick、pdftotext,但我想避免包装器/绑定(有时没有)。