Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.check_输出失败,出现错误127_Python_Subprocess - Fatal编程技术网

Python subprocess.check_输出失败,出现错误127

Python subprocess.check_输出失败,出现错误127,python,subprocess,Python,Subprocess,我试图从python应用程序中调用外部程序,但它没有显示输出,并且失败,出现错误127。从命令行执行命令效果良好。(我在正确的工作目录中) 每个循环都输出以下错误:(我还检查了e.cmd。它是正确的,但是很长,所以我在本例中省略了它) 解决方案: 下面的代码可以工作 app = subprocess.Popen(["./casperjs/bin/casperjs", "casper.js", startUrl, row[0]], stdout=subprocess.PIPE, stderr=su

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

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

解决方案:

下面的代码可以工作

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()

尝试在子流程中添加casperjs的完整路径。请检查_output()调用

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

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

shell=True
更改
check\u output()
call中第一个参数(
args
)的解释:

在shell=True的Unix上。。。如果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]])

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


如果您在macOS上遇到这种胡说八道:不要使用别名。因为那件事耽误了半天。因此,改变:

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


我懂了。所以我删除了shell=True并传递了casperjs的完整路径,但是我得到了一个错误,说它找不到phantomjs。“错误:1输出:致命:[Errno 2]没有这样的文件或目录;您安装了phantomjs吗?”我还重新添加了shell=True,但将命令的格式设置为:“url=subprocess.check_输出([”/casperjs/bin/casperjs casper.js“+startUrl+”“+row[0]],shell=True)”,并得到了相同的错误,除了错误127而不是错误1错误:127输出:致命:[Errno 2]没有这样的文件或目录;你安装了phantomjs吗?“编辑:格式化我猜错误是因为check_output()无法读取我的路径。有没有办法指定它要使用的路径?@Jeff:
print(os.environ)
并将其与
check_call(“/usr/bin/env”)进行比较
我怀疑它们非常相似,也就是说,您的问题不是子流程看到的
$PATH
与Python脚本不同。尽管您可以使用
env
参数为子流程设置自定义环境。
check_output()
将所有参数传递给
Popen()
它在内部使用。这让我得到了实际的输出,但是,它现在说它找不到phantomjs失败了。我想这是因为它找不到我的路径。有什么方法可以指定吗?我附加了我的答案以包含PATH环境变量。你在什么操作系统上运行它?OSX。我会给Popen看一看并让你知道。谢谢!明白了。下面的代码起作用了。为了格式化起见,我还将它添加到初始问题中。谢谢!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()
url = check_output(["./casperjs", "casper.js", startUrl, row[0]])
cwd=os.path.dirname(os.path.realpath(__file__))
a  = subprocess.check_output(["./casper.js", startUrl, row[0]],cwd=cwd,shell=True)
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)