5

我正在尝试从我的 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: 

解决方案:

以下代码有效

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

4 回答 4

2

尝试在 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()
于 2013-09-06T05:46:18.480 回答
1

shell=True更改调用中第一个参数 ( args)的解释,来自文档check_output()

在 Unix 上 shell=True, ... 如果 args 是一个序列,第一项指定命令字符串,任何 附加项将被视为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]])
于 2013-09-06T09:34:40.413 回答
0

尝试以这种方式显式添加路径。如果要调用的文件在同一路径中(__file__如果不是则更改):

cwd=os.path.dirname(os.path.realpath(__file__))
a  = subprocess.check_output(["./casper.js", startUrl, row[0]],cwd=cwd,shell=True)
于 2019-02-22T08:43:57.170 回答
0

如果您在 macOS 上遇到这种废话:不要使用 aliases。就这样丢了半天。所以,改变:

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)
于 2019-06-17T04:55:43.463 回答