Python子进程没有';t重新加载Nginx

Python子进程没有';t重新加载Nginx,python,python-3.x,nginx,Python,Python 3.x,Nginx,在python脚本(3.7)中,我尝试在创建配置后重新加载Nginx: import sys from urllib.request import Request, urlopen import subprocess import psycopg2 import dns.resolver import logging import os [...] logging.info(hostname+':Preparing co

在python脚本(3.7)中,我尝试在创建配置后重新加载Nginx:

    import sys
    from urllib.request import Request, urlopen
    import subprocess
    import psycopg2
    import dns.resolver
    import logging
    import os
    [...]
      logging.info(hostname+':Preparing configuration file')
      conf = content.replace('%%hostname%%', hostname)
      logging.info(hostname+':Creating configuration file')
      f = open(hostname + '.conf', 'w+')
      f.write(conf)
      f.close
      subprocess.run(["sudo", "mv", "/home/app/domain_script/"+hostname+".conf", "/etc/nginx/sites-available/"])
      subprocess.run(["sudo", "ln", "-s", "/etc/nginx/sites-available/"+hostname+".conf", "/etc/nginx/sites-enabled/"])
      subprocess.run(["sudo", "service", "nginx", "reload"])
    [...]
但是我注意到Nginx没有被重新加载。配置未激活且未显示任何错误

我试过:

subprocess.run(["sudo", "/usr/sbin/service", "nginx", "reload"])
subprocess.Popen(["sudo", "/usr/sbin/service", "nginx", "reload"])
subprocess.call(["sudo", "/usr/sbin/service", "nginx", "reload"])
同时添加以下内容:
time.sleep(10)

一切都没有成功

如果停止脚本,然后手动在shell中键入:
服务nginx reload
-它正在工作

如果该命令是要执行的最后一个代码,或者仅在python文件中使用该命令,则该命令有效

用户在sudoer列表中,不需要密码。

“子流程”是最重要、文档最完整的模块之一,有大量定制。这也使它成为最具挑战性的项目之一

为了回答你的问题,是一个小实用程序,它在不久前帮助我实现了类似的自动化

导入子流程
导入系统
def外壳输出(参数):
"""
此方法只接受要执行的shell命令并返回
此命令在shell中输出
:param param:command(例如“ls”)
:return:shell上输出的命令字符串
"""
尝试:
x=((subprocess.Popen)(
[str(param)],#将命令的每个部分作为列表元素,
shell=True,#在shell中运行
bufsize=0,
stdout=subprocess.PIPE,#将其赋予管道
stderr=subprocess.PIPE,#也为管道提供错误
universal_newlines=False,#是否包括换行符
)).communicate()[0]#这是从shell获取值
.decode(“utf-8”)#这是为了删除“b”,即从字节转换为字符串
).strip()
返回x。
例外情况除外,如e:
打印(“get_str”+str(e)中执行错误”)
返回e
打印(“可用的文本文件为:\n”+shell\u输出(“ls*txt”))
解决方案:

您的_命令=“service nginx reload”
#这将执行命令,并使用“$”验证其执行
打印(shell_输出(“{};echo$?;”。格式化(您的_命令)))

请尝试一下,如果有帮助,请告诉我:)

几个小时后,它最终可以与以下功能一起工作:

subprocess.run(["systemctl", "reload", "nginx"])

检查命令的输出。将
capture\u output=True
传递给
run()
调用,获取返回值并检查stdout&stdinIts empty的内容:
capture=subprocess.run([“sudo”,“/usr/sbin/service”,“nginx”,“reload”],capture\u output=True)print(capture.stderr)print(capture.stdout)print(capture.stdin)
手动运行
服务nginx reload
时,您是使用
sudo还是不使用
sudo
执行此操作?始终使用sudot。现在有
子流程。运行
和各种其他方便功能。不需要彻底改造轮子。subprocess.run确实可以继续使用,但需要进行一定数量的改进。reference->,但是subprocess.Popen()是另一个帮助Hanks的实用程序,但我得到了相同的结果。如果链接了几个subprocess.run,似乎不会发生这种情况。我还在调查