子进程调用不';t使用ipython笔记本服务器远程工作
我在python类中使用了类似于子进程调用不';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
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