我正在尝试获取这样的 processID pcmanfm
:
pgrep -f "pcmanfm"
当pcmanfm
没有运行时,上面的命令什么都不返回(正如我所料)。
但是,当我从 python 运行命令时,即使pcmanfm
未运行,它也会返回一个进程 ID:
processID = os.system('pgrep -f "pcmanfm"')
此外,如果您在 python3 提示符下多次运行上述命令,则每次都会返回不同的 processID。一直以来,pcmanfm
在这些命令之前已经关闭。
>>> processID = os.system('pgrep -f "pcmanfm"')
17412
>>> processID = os.system('pgrep -f "pcmanfm"')
17414
>>> processID = os.system('pgrep -f "pcmanfm"')
17416
pcmanfm
如果它当前没有运行,这真的会破坏我的启动能力。我的脚本认为它不是在运行时。
为什么会这样?
实际上,我在尝试根据我观看的视频编写的Autokey脚本中遇到了这个问题。这是我当前的脚本:
processID = system.exec_command('pgrep -f "pcmanfm" | head -1',True)
dialog.info_dialog("info",processID)
if (processID):
cmd = "wmctrl -lp | grep " + processID + " | awk '{print $1}'"
windowID = system.exec_command(cmd,True)
# dialog.info_dialog("info",windowID)
cmd = "wmctrl -iR " + windowID
#dialog.info_dialog("info",cmd)
system.exec_command(cmd,False)
else:
#os.system("pcmanfm /home/user/Downloads")
cmd = "/usr/bin/pcmanfm /home/user/Downloads"
system.exec_command(cmd,False)
问题是,即使pcmanfm
没有运行,我也会不断获取 processID。如果脚本正在运行,则该脚本会正确聚焦pcmanfm
,但如果不是,则不会启动它。
更新:我终于通过取出-f
并替换它-nx
(来自@they 的建议)来让这个脚本工作。此外,我添加了一些异常处理来忽略由预期的空输出引起的自动键异常。此外,我将它转换为(更灵活的)功能,以便它可以服务于更广泛的命令/应用程序:
import re
def focusOrLaunch(launchCommand):
appName = re.findall('[^\s/]+(?=\s|$)',launchCommand)[0]
processID = None
try:
processID = system.exec_command('pgrep -nx "' + appName + '"',True)
except Exception as e:
#dialog.info_dialog("ERROR",str(e))
pass
#dialog.info_dialog("info",processID)
if (processID):
cmd = "wmctrl -lp | grep " + processID + " | awk '{print $1}'"
windowID = system.exec_command(cmd,True)
# dialog.info_dialog("info",windowID)
cmd = "wmctrl -iR " + windowID
#dialog.info_dialog("info",cmd)
system.exec_command(cmd,False)
else:
system.exec_command(launchCommand,False)
cmd = "/usr/bin/pcmanfm ~/Downloads"
focusOrLaunch(cmd)