我创建了一个我想部署在服务器上的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容器外壳并在其中键入相同的'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
答案 0 :(得分:1)
遇到了完全相同的问题,以前的修复都不适合我。
我终于试过了
print("Hello world!", flush=True)
这似乎适用于我的环境(docker、python3.7)
答案 1 :(得分:0)
消除此问题的一种方法是: 1.使用'shell = False' 2.'subprocess.Popen()'没有返回值
subprocess.Popen(['python', mymain_path, args], shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)