子进程调用不';t使用ipython笔记本服务器远程工作

子进程调用不';t使用ipython笔记本服务器远程工作,python,subprocess,ipython,remote-server,Python,Subprocess,Ipython,Remote Server,我在python类中使用了类似于subprocess.call(“ruby_script.rb>output.txt”,shell=True)的代码来运行外部脚本 我有一个ipython笔记本服务器和我的Ubuntu台式机 在我的MacBook上,每当我远程运行使用包含上述子进程.call行的类的单元格时,我都会得到非零退出状态,表示找不到目录。如果我尝试简单的命令,如subprocess.check_call([“ls”,“-l”],shell=True),我将得到类似CalledProces

我在python类中使用了类似于
subprocess.call(“ruby_script.rb>output.txt”,shell=True)
的代码来运行外部脚本

我有一个ipython笔记本服务器和我的Ubuntu台式机

在我的MacBook上,每当我远程运行使用包含上述
子进程.call
行的类的单元格时,我都会得到非零退出状态,表示找不到目录。如果我尝试简单的命令,如
subprocess.check_call([“ls”,“-l”],shell=True)
,我将得到类似
CalledProcessError的命令:命令'['ls','-l']'返回非零退出状态2

在我的Ubuntu台式机上,每当我登录到同一台笔记本服务器并运行同一个单元格时,我都会得到完美的结果。如果我尝试像
subprocess.check\u call([“ls”,“-l”],shell=True)
这样的简单命令,我将得到像
0
这样的结果,表明根本没有错误

我想知道为什么这样的代码不能远程工作

在我的Ubuntu桌面机器上,服务器的python版本是2.7.6,而ipython版本是2.2.0

我的MacBook的OSX版本是10.9.4,我的台式机的Ubuntu版本是14.04LTS

谢谢

我尝试了Charles在我的MacBook上建议的代码,远程登录nbserver,将代码粘贴到笔记本中的一个单元格,然后运行该单元格


导入子流程
子进程。检查_调用(['ls','-l'],cwd='/'))

--------------------------------------------------------------------------- CalledProcessError回溯(最近一次呼叫上次) 在() 1导入子流程 ---->2子进程。检查_调用(['ls','-l'],cwd='/')) /检查调用中的usr/lib/python2.7/subprocess.pyc(*popenargs,**kwargs) 538如果cmd为None: 539 cmd=popenargs[0] -->540升起被调用的进程错误(retcode,cmd) 541返回0 542 CalledProcessError:命令'['ls','-l']'返回非零退出状态2
顺便说一句,如果我在运行nbserver的同一个Ubuntu桌面上执行上述操作,它也会起作用。

这不一定是问题的直接原因,但在传递数组时不要使用
shell=True
;在这种情况下,它的行为几乎总是不同于您实际想要的。Re:“说找不到目录”,顺便说一句——如果您在问题中包含了准确的错误文本,那将很有帮助。现在,我们不知道该错误是来自
ls
、来自调用shell还是来自Python。谢谢,charles。我添加了一条运行您建议的代码的错误消息。对于在macbook上运行有关外部脚本的单元格,我只知道执行ruby脚本的退出状态为1,执行编译后的c程序的退出状态为139。但是,如果我在同样托管nbserver的ubuntu机器上重复这个过程,那就没有问题了。接下来我要尝试的是确保设置了
PATH
。显式调用
/bin/ls
是一种方法。除此之外,是时候退出
strace
并查看服务器上实际发生的情况了。
exit status 2
意味着
ls
检测到严重故障。尝试将其输出重定向到一个文件:
check_调用([“ls”,“-l”],cwd=“/”,stdout=open('/tmp/ls.log',w'),stderr=subprocess.stdout)
--------------------------------------------------------------------------- CalledProcessError Traceback (most recent call last) in () 1 import subprocess ----> 2 subprocess.check_call(['ls', '-l'], cwd='/') /usr/lib/python2.7/subprocess.pyc in check_call(*popenargs, **kwargs) 538 if cmd is None: 539 cmd = popenargs[0] --> 540 raise CalledProcessError(retcode, cmd) 541 return 0 542 CalledProcessError: Command '['ls', '-l']' returned non-zero exit status 2