子进程调用在python中不起作用,但该命令在终端中工作

时间:2017-11-30 11:18:55

标签: python subprocess fasttext

当我从终端运行./fasttext时,它运行良好。但是,当我使用subprocess.check_output('./fasttext')进行尝试时,它会将错误视为。

错误

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的同一目录。

3 个答案:

答案 0 :(得分:1)

如果退出状态不为0,则

check_output仅引发错误。您尝试运行的命令./fasttext退出时为1,因为您没有遵循正确的使用模式。在终端中,它为您提供了一些文档但仍然以1退出,如果您不相信我(并且您不应该;))在终端中运行./fasttext; echo $?,您将看到退出状态。

所以简单地使用以下内容: a1 = check_output(['./fasttext', 'predict', <model>, <out>])

注意:

  • 检查输出返回一个字节。您可能对.decode("utf-8")感兴趣.split("\n")
  • Facebook现在有一个非常简单的wrapper用于python

答案 1 :(得分:1)

解决。通过在调用中使用shell = True参数来解决该问题。

答案 2 :(得分: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完成(在这里,使用{{ 1}})。