Python subprocess.Popen()无法在docker容器中工作 - 在本地工作正常

问题描述 投票:0回答:1

我创建了一个我想在服务器上部署的Django REST框架项目。我没有管理员访问服务器,因此,我发现确保所有项目依赖项(如Anaconda发行版)在服务器上可用的唯一方法是为我的项目创建一个docker镜像,然后创建服务器上的相应容器,然后从那里运行它。

在我的项目中,我有一个使用subprocess.Popen()调用的python脚本(mymain.py)。这在本地工作正常,subprocess.Popen()完成它应该做的一切。

但是,当我尝试从docker容器中执行此操作时,似乎完全跳过了行subprocess.Popen()[mymain.py未被调用]。

对于docker,我创建了一个docker-compose.yml文件,并在命令提示符下输入:

docker-compose up

我没有看到任何错误,一切似乎工作正常,但subprocess.Popen()似乎没有工作。

mymain.py的第一行是:

print('Testing if subprocess called mymain.py!!!')  

在另一个文件中,我调用subprocess.Popen()。我尝试打印出错误,但不幸的是,stdout和stderr都没有返回任何内容:

p = subprocess.Popen(['python', mymain_path, args], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
out, err = p.communicate()
print('SUBPROCESS ERROR: ' + str(err))
print('SUBPROCESS stdout: ' + str(out.decode()))    

这就是我得到的:

SUBPROCESS ERROR: None
SUBPROCESS stdout:

如你所见,我的main.py的第一行从未打印过......

但是,当我通过输入命令提示符在本地执行此操作时:

python manage.py runserver 9000

一切都没有问题(“如果子进程名为mymain.py !!!'测试就行了”)。

我甚至试图打开docker容器shell并在那里键入相同的'python manage.py runserver 9000'命令,但不幸的是,这不起作用。

现在的问题是,如何让子进程远程工作(在docker容器中)?

对此有任何帮助非常感谢!

我在用:

Docker version 18.09.2, build 6247962
docker-compose version 1.23.2, build 1110ad01
Python 3.7.0
django python-3.x docker subprocess
1个回答
0
投票

看起来摆脱这个问题的方法是:1。使用'shell = False'2.没有'subprocess.Popen()'的返回值

subprocess.Popen(['python', mymain_path, args], shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
© www.soinside.com 2019 - 2024. All rights reserved.