我有一个 shell 命令,它执行一个命令并通过管道将其发送到 python 文件。python 文件对其进行各种检查,然后使用 subprocess.Popen 启动带有参数的进程。但我发现它只有在我在 shell 中运行整个程序时才有效。除了 shell 之外,还有其他方法可以执行它吗?如果我在没有任何 shell 的情况下运行它或使用 & 将其保持在后台,则 python 启动的进程在 ps -e 表中被命名为 defunct。有人可以帮忙吗?
编辑:
这是我运行的 run.sh:
#!/bin/bash
padsp julius -input mic -C $HOME/project/julius-grammer/julian.jconf | python -u $HOME/project/pythonControls/getcommand.py
但是并非所有的 subprocess.popen 都会运行失败。例如,如果我使用 festival 程序,它就会运行。但是 xbacklight 不会运行。
这是getcommand.py:
我删除了不必要的部分,这是必要的部分,com 是字符串,我知道这个选择正常进行。:
if(com == "COMPLETE BRIGHTNESS"):
userin = Data(["xbacklight", "-set", "100"],"Maximum brightness")
userin.interact()
if(com == "HALF BRIGHTNESS"):
userin = Data(["/usr/bin/xbacklight", "-set", "50"],"Partial brightness")
userin.interact()
if(com == "ZERO BRIGHTNESS"):
userin = Data(["/usr/bin/xbacklight","-set", "0"],"Minimal brightness")
userin.interact()
现在谈到对象,类的运作方式如下:
class Data:
def __init__(self, com="", msg="", sp="False"):
self.command = com
self.message = msg
self.speak = sp
def interact(self):
if self.command != "":
co = subprocess.Popen(self.command,stdout=subprocess.PIPE)
co.wait()
if self.speak == True:
self.say(self.message)
else:
subprocess.Popen(["notify-send","SysSec", self.message])
答案1
当您在没有控制台的情况下运行脚本时,您是在图形会话环境中执行此操作。
创建一个名为testenv.sh
以下行的文件:
#!/bin/bash
env > ~/testenv.txt
将文件放在与脚本相同的目录中。从图形会话运行它。打开文件,将其保存到其他地方。然后从终端运行该文件并比较输出。
问题很可能出在这里PWD
。您依赖在您所在的同一目录中运行的脚本,但所有在图形会话环境中运行的脚本都是使用PWD
您主目录中的设置运行的。
也可能是你的脚本缺少舍邦。