subprocess.check_output失败,错误127

时间:2013-09-06 03:47:31

标签: python subprocess

我正在尝试从我的python应用程序调用外部程序,但它没有显示输出并且失败并显示错误127.从命令行执行命令工作正常。 (我在正确的工作目录中)

def buildContris (self, startUrl, reportArray):
    urls = []

    for row in reportArray:
        try:
            url = subprocess.check_output(["casperjs", "casper.js", startUrl, row[0]], shell=True)
            print (url)
            urls.append(url)
            break
        except subprocess.CalledProcessError as e:
            print ("Error: " + str(e.returncode) + " Output:" + e.output.decode())          

    return urls

每个循环输出以下错误:(我也检查了e.cmd。它是正确的,但很长,所以我在这个例子中省略了它)

Error: 127 Output: 

SOLUTION:

以下代码可以使用

app = subprocess.Popen(["./casperjs/bin/casperjs", "casper.js", startUrl, row[0]], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env = {"PATH" : "/usr/local/bin/:/usr/bin"}, universal_newlines=True)
app.wait()
out, errs = app.communicate()

4 个答案:

答案 0 :(得分:3)

尝试在subprocess.check_output()调用中添加casperjs的完整路径。

编辑:回答你的第二个问题。我在iPad上对格式化表示歉意。 我认为您应该尝试使用Popen而不是check_output,以便您可以指定环境变量:

p = subprocess.Popen(["/path/to/casperjs", "casper.js", startUrl, row[0]], env={"PATH": "/path/to/phantomjs"})
url, err = p.communicate()

答案 1 :(得分:0)

shell=True更改了args来电,from the docs中第一个参数(check_output())的解释:

  

在Unix上使用shell = True,...如果args是a   sequence,第一项指定命令字符串,以及任何   其他项将被视为 shell的附加参数   本身。也就是说,Popen相当于:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

退出状态127可能意味着shell未找到casperjs程序或casperjs本身已退出该代码。

修复代码:删除shell=True并指定casperjs程序的完整路径,例如:

url = check_output(["./casperjs", "casper.js", startUrl, row[0]])

答案 2 :(得分:0)

尝试以这种方式显式添加路径。 如果要调用的文件位于同一路径中(如果没有,请更改__file__

cwd=os.path.dirname(os.path.realpath(__file__))
a  = subprocess.check_output(["./casper.js", startUrl, row[0]],cwd=cwd,shell=True)

答案 3 :(得分:0)

如果您在macOS上遇到这种废话:请勿使用别名。失去了半天。因此,请更改:

subprocess.check_output(
    "scribus-ng -g -ns -py {0} {1}".format(script_path, id),
    stderr=subprocess.STDOUT,
    shell=True)

subprocess.check_output(
    "/Applications/Scribus.app/Contents/MacOS/Scribus -g -ns -py {0} {1}".format(script_path, id),
    stderr=subprocess.STDOUT,
    shell=True)