Python subprocess.Popen() 在 docker 容器中不起作用 - 在本地工作正常

Nod*_*ame 7 django subprocess python-3.x docker

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

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

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

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

docker-compose up
Run Code Online (Sandbox Code Playgroud)

我没有看到任何错误,一切似乎都运行良好,但是 subprocess.Popen() 似乎不起作用。

mymain.py 第一行是:

print('Testing if subprocess called mymain.py!!!')  
Run Code Online (Sandbox Code Playgroud)

在另一个文件中,我调用 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()))    
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

SUBPROCESS ERROR: None
SUBPROCESS stdout:
Run Code Online (Sandbox Code Playgroud)

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

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

python manage.py runserver 9000
Run Code Online (Sandbox Code Playgroud)

一切正常(打印“测试是否名为 mymain.py 的子进程!!!”这一行)。

我什至尝试打开 docker 容器外壳并在其中键入相同的“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
Run Code Online (Sandbox Code Playgroud)

Nod*_*ame 5

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

subprocess.Popen(['python', mymain_path, args], shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
Run Code Online (Sandbox Code Playgroud)