2017-11-30 8 views
0

端末から./fasttextを実行するとうまく動作します。しかし、私がsubprocess.check_output('./fasttext')で試してみると、エラーが発生しています。サブプロセス呼び出しがPythonでは機能していませんが、コマンドが端末で動作しています

エラー

CalledProcessError       
Traceback (most recent call last) 
<ipython-input-11-a048dbef034f> in <module>() 
     1 from subprocess import check_output 
     2 from subprocess import call 
----> 3 a1 = check_output('./fasttext') 
     4 
     5 #a = check_output('./fasttext print-sentence-vectors ~/Vaiju/Project/all code and data/My Code/TrainedModels/wiki_unigrams.bin < 1fasttext.test.txt') 

/home/vaijenath/anaconda2/lib/python2.7/subprocess.pyc in check_output(*popenargs, **kwargs) 
    571   if cmd is None: 
    572    cmd = popenargs[0] 
--> 573   raise CalledProcessError(retcode, cmd, output=output) 
    574  return output 
    575 

CalledProcessError: Command './fasttext' returned non-zero exit status 1 

fasttextは、ノートブックに存在していると私は同じディレクトリにしています。

+0

pythonがちょうどゼロ以外の終了ステータスを報告しているようです。代わりに 'call'を使うことを考えているようです。それを試みるとどうなりますか? – quamrana

+0

私は呼び出しを使用すると、ファイルまたはディレクトリがないと言います。しかし、それはどのファイルを取得していません。 –

答えて

1

check_outputは、終了ステータスが0でない場合にのみエラーをスローします。./fasttextを実行しようとしているコマンドは、正しい使用パターンに従わなかったために1で終了します。端末では、いくつかのドキュメントを提供していますが、あなたが私を信じていない場合は、1で終了します(そして、そうしないでください))./fasttext; echo $?を端末に実行すると、終了ステータスが表示されます。

だから、単にのようなものを使用します。 a1 = check_output(['./fasttext', 'predict', <model>, <out>])

注:

  • チェック出力は、バイトを返します。あなたは、Facebookは今のpython解決
0

のための非常にシンプルなwrapperを持って.split("\n")

  • へ順に.decode("utf-8")に興味があるかもしれません。問題は、呼び出しでshell = True引数を使用することで解決されます。

  • +0

    これは文字通り信じられません。実際の 'args'値が何かのものであれば' shell = True'は手元の特定の問題(起動されているプログラムが正常に実行されたが、あなたは質問に答えました。 –

    +0

    ''。/ fasttext ''ではなく '' ./fasttext arg1 arg2 ... ''であれば、' 'shell = True'(悪い答え)、または文字列を '['.fastfast'、 'arg1'、 'arg2']'(良い答え)のようなリストに置き換えます。 'shell = True'がなぜ悪いのかについては、https://docs.python.org/2/library/subprocess.html#frequently-used-argumentsの赤い警告を参照してください。 –

    +0

    ( 'shell = True'は、実行されているプログラムが実行可能とマークされているが有効なシバンがない問題を回避できますが、問題であればOSError:[Errno 8 ] Exec format error' - その場合、正しい答えはシェルを使わずにスクリプトを実際に実行可能にすることです。 –

    0

    あなたの本当のユースケースは、次のようになります。各引数は別のリストのメンバーとして渡されること

    import subprocess 
    import os.path 
    
    a = subprocess.check_output([ 
        './fasttext', 
        'print-sentence-vectors', 
        os.path.expanduser('~/Vaiju/Project/all code and data/My Code/TrainedModels/wiki_unigrams.bin'), 
    ], stdin=open('1fasttext.test.txt', 'r')) 
    

    注意を。リダイレクトはPython(この場合は<リダイレクトの代わりにstdin=を使用)を使用して実行され、~のような拡張子をPythonで実行する必要があります(ここではos.path.expanduser())。

    関連する問題