在Ubuntu(Gnome)面板中添加和更改图标的最简单方法是什么?我正在寻找像shell脚本这样简单的东西,但我不仅限于此。如果是更好或更简单的方法,将为此编写程序。
这个想法是创建一个脚本/程序来监视某些情况(例如,安装点的可用性,互联网连接的可用性),并更改图标的状态以反映当前状态。
在子进程调用中,我想使用shell = True,以便它对路径名(下面的代码)进行通配,但是这会产生令人讨厌的副作用,即subprocess生成子进程(必须是`communication()d/poll ()ed/wait()ed/terminate()d/kill()ed/whatevah).
(是的我知道globing也可以用fnmatch/glob来完成,但是请告诉我子进程的'正确'用法,即获得stdout和停止子进程的最小咒语.)
这工作正常(返回输出):
subprocess.check_output(['/usr/bin/wc','-l','[A-Z]*/[A-Z]*.F*'], shell=False)
但这就挂了
subprocess.check_output(['/usr/bin/wc','-l','[A-Z]*/[A-Z]*.F*'], shell=True)
(PS:严重加剧你不能告诉子进程你想要一些但不是所有 shell功能,例如通配但不产生.我认为有一个值得的PEP,如果有人关心评论,即传入一个布尔元组,或一个或二元标志)
(PPS:你是否通过的成语subprocess...(cmdstring.split() or [...])只是一个微不足道的习惯性差异.我说番茄,你说tomay-to.在我的情况下,动机是命令是固定的,但我可能想要多次调用它有区别文件规范).
是否可以读取在python中通过LogCat发送的信息?
我有一个用java编写的程序.它发送的每个并条标记:"Fps:"消息:数字
我希望这条消息能够触发我可以在我的python脚本中捕获的事件,这样我就可以绘制一个fps-meter.
我在Python 3中生成具有超时的异步子进程时遇到问题.
我想要实现的目标:我希望异步生成多个进程而不等待结果,但我还要确保每个生成的进程都会在给定的超时内结束.
我在这里发现了类似的问题:在Python中使用模块'subprocess'和超时以及异步后台进程?但他们没有解决我的问题.
我的代码看起来像这样.我有使用模块'subprocess'和超时建议的Command类:
class Command(object):
def __init__(self, cmd):
self.cmd = cmd
self.process = None
def run(self, timeout):
def target():
print('Thread started')
args = shlex.split(self.cmd)
self.process = subprocess.Popen(args, shell=True)
self.process.communicate()
print('Thread finished')
thread = threading.Thread(target=target)
thread.start()
thread.join(timeout)
if thread.is_alive():
print('Terminating process')
self.process.terminate()
thread.join()
Run Code Online (Sandbox Code Playgroud)
然后当我想要产生子进程时:
for system in systems:
for service in to_spawn_system_info:
command_str = "cd {0} && python proc_ip.py {1} {2} 0 2>>{3}".format(home_dir,
service, system, service_log_dir)
command = Command(command_str)
command.run(timeout=60)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,输出似乎等待每个命令生成并结束.我明白了
Thread …Run Code Online (Sandbox Code Playgroud) 我知道在 SO 上有很多类似的问题,比如这个或这个,也许还有更多,但似乎没有一个适用于我的特定情况。我对subprocess.Popen()工作原理缺乏了解也无济于事。
我想要实现的是:启动一个子进程(一个命令行收音机播放器),它也向终端输出数据,也可以接收输入——等待一段时间——终止子进程——退出shell。我在 OSX 10.9 上运行 python 2.7
案例 1. 这将启动广播播放器(但仅限音频!),终止进程,退出。
import subprocess
import time
p = subprocess.Popen(['/bin/bash', '-c', 'mplayer http://173.239.76.147:8090'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=False,
stderr=subprocess.STDOUT)
time.sleep(5)
p.kill()
Run Code Online (Sandbox Code Playgroud)
案例 2. 这将启动收音机播放器,输出诸如收音机名称、歌曲、比特率等信息并接受输入。它终止子进程,但它从不存在 shell,即使使用“Ctrl-C”,终端也无法使用。
p = subprocess.Popen(['/bin/bash', '-c', 'mplayer http://173.239.76.147:8090'],
shell=False)
time.sleep(5)
p.kill()
Run Code Online (Sandbox Code Playgroud)
关于如何做到这一点的任何想法?我什至在想,如果没有其他选择,是否有可能为子进程打开一个slave-shell(当然这也是我不知道的事情)。谢谢!
我一直在尝试找出如何启动不同的子流程实例,然后杀死它们然后创建新的实例。父python进程从不执行,只会杀死子进程。我在SO上跟踪了很多链接,但是一旦父python进程结束,我就会不断收到以下消息:
F/Users/Lucifer/miniconda3/envs/rltp/lib/python3.6/subprocess.py:761: ResourceWarning: subprocess 40909 is still running ResourceWarning, source=self)
Run Code Online (Sandbox Code Playgroud)
这似乎很有趣,因为我做到了,ps但是却一无所获:
PID TTY TIME CMD
7070 ttys001 0:00.06 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp Lucifer
7072 ttys001 0:00.61 -bash
17723 ttys002 0:00.06 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp Lucifer
17725 ttys002 0:00.06 -bash
38586 ttys002 0:00.16 sertop --no_init
Run Code Online (Sandbox Code Playgroud)
我只想开始一个过程:
self.serapi = subprocess.Popen(['sertop','--no_init'],
stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,
preexec_fn=os.setsid,shell=True
,)
Run Code Online (Sandbox Code Playgroud)
并杀死它:
os.killpg(os.getpgid(self.serapi.pid), signal.SIGTERM)
Run Code Online (Sandbox Code Playgroud)
上面的代码本质上是从最上面的答案复制的:
但我不确定为什么会收到此消息。我是否成功终止了子进程?我计划启动并杀死其中许多人。
注意我不知道或不需要shell=True。我只是复制了那个,就是我发布的答案/问题的答案。我宁愿没有那个参数。
根据我尝试的答案:
def kill(self):
self.serapi.wait()
#self.serapi.kill()
self.serapi.terminate()
#os.killpg(os.getpgid(self.serapi.pid), signal.SIGTERM)
#self.serapi.wait()
Run Code Online (Sandbox Code Playgroud)
以及上述内容的不同排列方式,但似乎没有任何效果。有什么建议吗?
我在 python 中用 subprocess.call 创建了一个进程
import subprocess
x = subprocess.call(myProcess,shell=True)
Run Code Online (Sandbox Code Playgroud)
我想杀死这两个进程,即 shell 及其子进程(我的进程)。
使用 subprocess.call() 我只得到进程的返回码
有人能帮忙吗 ?
我正在使用以下命令启动子进程:
p=subprocess.Popen(["google-chrome","--new-window","http://www.hckrnews.com"])
Run Code Online (Sandbox Code Playgroud)
我需要在一段时间后终止这个过程,所以我正在使用:
time.sleep(t)
p.terminate()
Run Code Online (Sandbox Code Playgroud)
仅当浏览器的实例尚未打开时,此方法才有效.如果已存在浏览器窗口,则会打开一个新窗口,但不会在指定时间后终止.
我也尝试了这个问题中给出的方法,但是在已经存在的窗口的情况下也不起作用.
我正在使用以下命令
subprocess.call(cmd, shell=True)
Run Code Online (Sandbox Code Playgroud)
该命令不会自动终止。如何杀死它?
遵循如何终止使用 shell=True 启动的 python 子进程的建议
我有一个过程,我从以下开始
process = subprocess.Popen(my_cmd, shell=True, executable='/bin/bash', preexec_fn=os.setsid)
Run Code Online (Sandbox Code Playgroud)
my_cmd 的形式为 some_cmd_that_periodically_outputs_to_stdout | grep "some_fancy_regex" > some_output_file.txt
我用以下命令终止进程
os.killpg(os.getpgid(process.pid), signal.SIGKILL)
Run Code Online (Sandbox Code Playgroud)
杀死后,我收到以下警告
ResourceWarning: subprocess XXX is still running
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此警告?
python ×9
subprocess ×6
kill-process ×2
android ×1
asynchronous ×1
events ×1
glob ×1
gnome ×1
kill ×1
linux ×1
logcat ×1
panel ×1
python-2.7 ×1
python-3.x ×1
ubuntu ×1