web-dev-qa-db-ja.com

ターミナルなしでシェルスクリプトを実行する方法

コマンドを実行し、それをパイプ経由でpythonファイルに送信するシェルコマンドがあります。pythonファイルは、そのファイルに対してさまざまなチェックを行い、次にプロセスを開始しますパラメータを使用してsubprocess.Popenを実行します。ただし、シェルですべてを実行した場合にのみ機能することがわかります。シェル以外で実行する別の方法があります。シェルなしで実行するか、&を使用して保持する場合バックグラウンドで、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が実行に失敗するわけではありません。たとえば、フェスティバルプログラムを使用すると、実行されます。ただし、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
user1652263

コンソールなしでスクリプトを実行すると、グラフィカルセッション環境で実行されます。

次の行を含むtestenv.shという名前のファイルを作成します。

#!/bin/bash
enc > ~/testenv.txt

ファイルをスクリプトと同じディレクトリに置きます。グラフィカルセッションから実行します。ファイルを開き、別の場所に保存します。次に、ターミナルからファイルを実行し、出力を比較します。

たぶん、ここでの問題はPWDです。スクリプトは現在と同じディレクトリで実行されることに依存していますが、すべてのスクリプトはグラフィカルセッション環境で実行され、ホームディレクトリにPWDを設定して実行されます。

Shebang がないスクリプトでも問題になる可能性があります。