我正在尝试使用模块python cmd编写python CLI程序。当我尝试在CLI程序中执行另一个python脚本时,我的目标是在其他文件夹中有一些python脚本,在其他文件夹中有CLI程序。我正在尝试使用CLI程序执行这些python脚本。
下面是用于执行其他脚本的os.popen方法,有CLI程序:
import cmd
import os
import sys
class demo(cmd.Cmd):
def do_shell(self,line,args):
"""hare is function to execute the other script"""
output = os.popen('xterm -hold -e python %s' % args).read()
output(sys.argv[1])
def do_quit(self,line):
return True
if __name__ == '__main__':
demo().cmdloop()
和野兔是错误的:
(Cmd) shell demo-test.py
Traceback (most recent call last):
File "bemo.py", line 18, in <module>
demo().cmdloop()
File "/usr/lib/python2.7/cmd.py", line 142, in cmdloop
stop = self.onecmd(line)
File "/usr/lib/python2.7/cmd.py", line 221, in onecmd
return func(arg)
TypeError: do_shell() takes exactly 3 arguments (2 given)
有一些指向其他cmd CLI程序的链接 1 = cmd – Create line-oriented command processors 2 = Console built with Cmd object (Python recipe)
请在您的系统中运行以上代码。
答案 0 :(得分:1)
如doc:
中所述https://pymotw.com/2/cmd/index.html
do_shell定义如下:
do_shell(self, args):
但是你将其定义为
do_shell(self, line, args):
我认为预期用途是按照文档中的规定来定义它。
我运行了你的代码并按照你的例子。我复制了你的错误。然后,我按照do_shell的文档中的说明,将方法更改为预期的方法:
do_shell(self, args):
从那里,sys
模块丢失了,所以你也需要导入它(除非你没有从你的源中复制它)。之后,我得到索引超出范围的错误,可能是因为期望需要传递额外的参数。
此外,因为您正在讨论Python脚本,我不认为您需要添加额外的命令,我只需将该行更改为:
output = os.popen('python %s' % args).read()
但是,如果有一个特殊的原因你需要xterm命令,那么你可以把它放回去,它将适用于你的特定情况。
我也是,没有看到这个用例:
output(sys.argv[1])
我评论说出来了。我运行了你的代码,一切正常。我创建了一个测试文件,只做了一个简单的打印,并成功运行。
所以,代码实际上是这样的:
def do_shell(self, args):
"""hare is function to execute the other script"""
output = os.popen('python %s' % args).read()
print output
完整代码应如下所示:
import cmd
import os
import sys
class demo(cmd.Cmd):
def do_shell(self, args):
"""hare is function to execute the other script"""
output = os.popen('python %s' % args).read()
print output
def do_quit(self,line):
return True
if __name__ == '__main__':
demo().cmdloop()