使用python中的ruby-gem/command

使用python中的ruby-gem/command,python,shell,command,subprocess,haml,Python,Shell,Command,Subprocess,Haml,我已经在mac上安装了Ruby gem'haml',我可以在终端使用以下命令将haml文件编译成html文件: haml 'path/to/haml/file.haml' 'desired/html/path/file.html' 这个命令只是在第二个路径创建一个html文件,在终端中不提供任何输出。例如,这个命令: haml "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml" "/Volumes/Macintosh HD/Users/

我已经在mac上安装了Ruby gem'haml',我可以在终端使用以下命令将haml文件编译成html文件:

haml 'path/to/haml/file.haml' 'desired/html/path/file.html'
这个命令只是在第二个路径创建一个html文件,在终端中不提供任何输出。例如,这个命令:

haml "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml" "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.html"
在给定路径上创建sugar.html文件。现在我正试图从python脚本中使用此功能。当我在IDLE的交互式python shell中键入此命令时:

>>>import subprocess
>>>subprocess.Popen('haml "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml"        "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.html"', shell=True, executable='/bin/bash')
<subprocess.Popen object at 0x159d6f0>
导入子流程 >>>subprocess.Popen('haml”/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml”“/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.html”“,shell=True,executable='/bin/bash') 我得到的输出表明进程已经运行,但是没有输出文件。为什么会这样?我甚至加入了Shell参数,但没有显示交互式Shell。另外,我在某个地方读到,默认使用的shell不是bash,这是Mac终端所使用的,所以我把它也放进去了

按照icktoofay的建议,我打了一个检查电话。这是我收到的回溯:

回溯(最近一次呼叫最后一次):
文件 “/Users/neil/Desktop/subprocesstest.py”, 第7行,在 p=子进程。检查调用(x,shell=True)文件 “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”, 第504行,检查通话 引发调用的进程错误(retcode,cmd)调用的进程错误:命令“haml” “/Volumes/Macintosh HD/Users/neil/Sites/ICSP/sugar.haml“ “/Volumes/Macintosh HD/Users/neil/Sites/ICSP/sugar.html“' 返回非零退出状态127

根据,在搜索要执行的命令时

如果名称既不是外壳也不是外壳 函数也不是内置的,并且包含 没有斜杠,Bash搜索每个元素 包含 以该名称命名的可执行文件。。。如果 未定义该函数,则 shell打印一条错误消息并 返回127的退出状态

但是,我认为在添加shell和可执行参数之后确实找到了haml命令,因为在此之前,它给出了一个“文件或目录未找到错误”,这表明该函数不是直接可执行的,而是仅在shell中


现在我如何让python找到这个haml命令?或者我必须使用一些难看的解决方法,比如applescript,然后调用haml命令。

我看到您使用的是,
shell=True
,所以我希望一切正常。在本地用Python2.7.1和HAML3.1.1检查它,我在执行它时没有问题。还有一些您可能感兴趣的python实现、或

导入子流程
subprocess.Popen(['haml','hello.haml','hello.html'],shell=True)
%cat hello.html
你好,世界
是你的朋友,当你想建立适合
Popen
及其同类的
args
列表时

>>> import subprocess
>>> import shlex
>>> p = subprocess.Popen(shlex.split('haml "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml" "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.html"'))
>>> p.wait()
0

您是否尝试过使用而不是直接使用?很抱歉,问题现在似乎太长了,但我已尝试提供尽可能多的信息以简化调试。您可能尝试过类似的方法,但这是否有效(路径已明显更改)
subprocess.check_调用(['/path/to/haml','/your/file.haml','/your/file.html'])
结果表明,在原始调用中放置haml的完整路径非常有效。现在,我如何使这个设备独立,即如何使python找到haml?或者我应该要求脚本用户将haml放入他们的系统路径中还是什么?我确实使用了
shell=True
参数。我将尝试使用haml的完整路径,但由于我猜这会因计算机而异,因此很难将其转换为可分发脚本。另外,我在前面查看了python实现,但它们似乎不仅仅是调用haml编译器的python桥,它们实际上自己处理编译,有时会产生与官方haml gem不同的输出。我不想冒险使用python实现,因为它将来在语法支持方面可能会落后。@Neil啊,我现在明白了。那你就可以工作了。很奇怪。也许是哈姆的臭虫?我刚刚测试过,它对我来说很好。
>>> import subprocess
>>> import shlex
>>> p = subprocess.Popen(shlex.split('haml "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.haml" "/Volumes/Macintosh HD/Users/me/Sites/ICSP/sugar.html"'))
>>> p.wait()
0