【问题标题】:Python subprocess.Popen() not working in a docker container - works fine locallyPython subprocess.Popen() 不能在 docker 容器中工作 - 在本地工作正常
【发布时间】:2019-07-09 21:37:26
【问题描述】:

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

在我的项目中,我有一个使用 subprocess.Popen() 调用的 python 脚本 (mymain.py)。 这在本地运行良好,并且 subprocess.Popen() 完成了它应该做的所有事情。

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

对于 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 容器外壳并在其中键入相同的“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】:

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

    subprocess.Popen(['python', mymain_path, args], shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    

    【讨论】:

    • 这对我帮助很大!看起来 shell=True 似乎隐藏了标准输出,尤其是在错误时!我建议将此标记为已接受的答案。 P.S.在 python 调用中添加 -u 解决了我的情况(我需要 shell=True),因为如果发生异常,shell 似乎没有刷新输出!
    【解决方案2】:

    遇到了完全相同的问题,以前的修复都没有对我有用。

    我终于尝试了

    print("Hello world!", flush=True)
    

    这似乎在我的环境中工作(docker,python3.7)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2018-03-07
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多