2016-11-30 18 views
0

端末上のargsで指定されたコマンドを実行している場合、端末上で正常に実行されますが、Pythonプログラムでは同じことが実行されていません。私は入力tarファイルのサイズとxterm単語の多くに画面の迷惑な文字を見ています。このtarコマンドをPythonサブプロセスの引数として渡す方法

私は問題がargsの ''文字を扱っていると感じています。

import subprocess 

try: 
    args = "cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz".split() 
    subprocess.check_call(args) 
except subprocess.CalledProcessError as e: 
    print e 
+2

「機能しません」とはどういう意味ですか? – Chris

+0

@Chris;あなたのコメントに固有の質問を更新しました。 – Viswesn

+0

トピックを削除しますが、 'split()'の代わりに['shlex.split()'](https://docs.python.org/3.5/library/shlex.html#shlex.split)を使用してください。 – squiguy

答えて

0

私はいくつかの選択肢を試しましたが、どれも満足できませんでした。私が見つけた最高のものはPopenに切り替わりました。

# this should have the a similar signature to check_call 
def run_in_shell(*args): 
    # unfortunately, `args` won't be escaped as it is actually a string argument to bash. 
    proc = subprocess.Popen(['/bin/bash', '-c', ' '.join(args)]) 
    # This will also work, though I have found users who had problems with it. 
    # proc = subprocess.Popen(' '.join(args), shell=True, executable='/bin/bash') 
    stat = proc.wait() 
    if stat != 0: 
     subprocess.CalledProcessError(returncode=stat, cmd=command) 
    return stat 

run_in_shell("cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz") 

注:/bin/shは、エスケープされていない括弧に問題があります。あなたは上記の'/bin/bash'を指定したくない場合は、括弧をエスケープする必要があります。

args = 'cat parsing.tgz <\\(echo -n ''| gzip\\)> new-file.tgz' 
+0

問題はargsに特殊文字 ''が付いていても、shlexはこの特殊文字を認識していませんviswesn @ viswesn:viswesn @ viswesn: 〜$ python tar.py cat parsing.tgz <(echo -n '' | gzip)> new-file.tgz /bin/sh:1:構文エラー: "(予期しない" コマンド 'cat parsing.tgz < (echo -n '' | gzip)> new-file.tgz 'が0以外の終了ステータス2を返すようになりました。 – Viswesn

1

は、私は専門家ではないですが、これは、私が見つかりました - これはshで作業していて、bashに動作していないコマンド:

$ sh -c "cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz" 
sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz' 
$ 
$ bash -c "cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz" 
$ 

これは、サブプロセスで直接動作しない理由です。このコードは正常に動作しています:

import subprocess 
command = "cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz" 
subprocess.Popen(command, shell=True, executable='/bin/bash') 
+0

はい、今はbashで作業していますが、なぜshで動作しないのか驚いています。 – Viswesn

関連する問題