我确定这很简单,但是我正在尝试几种设置,但似乎无法正常工作。
我有以下代码:
import subprocess
p = subprocess.Popen('mkdir -p /backups/my_folder', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
它正在flask
和nginx
上的python 3
应用程序中运行
执行此操作时,出现以下错误:
/ bin / sh:1:mkdir:找不到
我已经尝试过shell=False
,已经尝试过Popen(['mkdir', ...])
,并且已经尝试过question/answer这样的subprocess.run
如果我使用shell = False运行,则会出现以下错误:
错误:[Errno 2]没有这样的文件或目录:'mkdir -p / backups / my_folder':'mkdir -p / backups / my_folder'
当我执行/bin/mkdir
时,它可以工作。但是,还有其他命令会调用失败的子命令(例如,tar
会调用gz
)
要使它正常工作,我缺少什么?
运行:
Debian 9.8,Nginx 1.14.0,Python 3.6.8
编辑
我也需要它来处理其他命令。我知道我可以使用os.makedirs
,但是我将执行几个不同的命令(rsync,ssh,tar等)
答案 0 :(得分:1)
对于这些简单的命令,请尝试使用python而不是调用shell-它使您与环境更加独立:
os.makedirs('/backups/my_folder', exist_ok=True)
答案 1 :(得分:0)
我发现了问题。
我意识到我的/etc/systemd/system/site.service
uWSGI设置具有硬编码路径:
环境= / usr / local / bin
一次,我将其更改为包括/bin
,我所有的子流程命令都很好地执行了。
答案 2 :(得分:-1)
import subprocess
p = subprocess.Popen('mkdir -p my_folder', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
(result, error) = p.communicate()
print(result)
这仅适用于Windows 10。