我正在尝试从我的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()
答案 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)