Autokey - 実行中の場合はアプリケーションウィンドウに焦点を当て、それ以外の場合はアプリケーションを起動します。

Autokey - 実行中の場合はアプリケーションウィンドウに焦点を当て、それ以外の場合はアプリケーションを起動します。

pcmanfm次のようにprocessIDを取得しようとしています。

pgrep -f "pcmanfm"

実行されない場合、pcmanfm上記のコマンドは期待どおりに何も返しません。

ただし、Pythonでコマンドを実行すると、pcmanfm実行していない場合でもプロセスIDが返されます。

processID = os.system('pgrep -f "pcmanfm"')

また、python3プロンプトで上記のコマンドを複数回実行すると、毎回異なるプロセスIDが返されます。その間、pcmanfmこれらの命令よりも閉鎖が最初に行われました。

>>> processID = os.system('pgrep -f "pcmanfm"')
17412
>>> processID = os.system('pgrep -f "pcmanfm"')
17414
>>> processID = os.system('pgrep -f "pcmanfm"')
17416

pcmanfm現在実行されていない場合、ブート機能は本当に混乱します。私のスクリプトは実行中だと思いますが、実際にはそうではありません。

なぜこれが起こるのですか?

実際にこの問題にぶつかりました。自動キーこれに基づいて私が書こうとしたスクリプトは動画私はそれを見た。これは私の現在のスクリプトです。

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交換して動作させました(@theyの提案)。-nxまた、予想される空の出力に起因する自動キー例外を無視するために、いくつかの例外処理を追加しました。また、より広い範囲のコマンド/アプリケーションを提供できるように(より柔軟な)機能に変換しました。

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)

ベストアンサー1

提案されたソリューション:

-fコマンドからこのオプションを削除しますpgrep


説明する:

コマンドを実行するために実行されたシェルのプロセスIDを取得できます。それぞれに使用されますsystem.exec_command

たとえば、実行してsh -c 'pgrep -af nonexistent'出力を確認します。あなたは次のようなものを得ることができます

11300 sh -c pgrep -af nonexistent

既存のコマンドを使用してシェルでも1行を取得しました。

sh -c 'pgrep -af sshd'
695 /usr/sbin/sshd -D
11207 sshd: pi [priv]
11224 sshd: pi@pts/0
11331 sshd: [accepted]
11343 sh -c pgrep -af sshd

PID値に応じて、コマンドはhead探しているプロセスのPIDまたはシェルプロセスのPIDを抽出できます。

オプションを使用すると、プロセス名だけでなくコマンドライン全体を検索するように-f明示的に指示できます。pgrepこれにより、シェルのコマンドライン引数で文字列を見つけることができます。

これがなければ、-fシェルプロセスを取得できません。

$ sh -c 'pgrep -a sshd'
695 /usr/sbin/sshd -D
11207 sshd: pi [priv]
11224 sshd: pi@pts/0
11364 sshd: [accepted]

おすすめ記事