我最近开始学习python。我用Django创建了一些基本的webapps并编写了一些简单的脚本。在使用VIM作为Python IDE后,我真的感到满意,我喜欢“终端程序”(这是否有官方术语?)。现在,我能够做一些简单的事情,例如询问某人的年龄并将其打印到屏幕上。然而,这归结为运行.py脚本,并在完成此脚本之后返回正常的bash。我想创建一个程序,我可以从命令行运行,这将允许与VIM(一个打开和关闭)相同的用户体验。例如,我创建了一个简单的脚本来导入RSS源。如果我可以打开我的终端类型我的程序名称 - >这将是很酷的。程序将打开 - >然后我想使用如:findsomething之类的命令。基本上与我的程序有真正的互动。
总结:
答案 0 :(得分:22)
在* nix系统(linux / unix)上,
如果你:
$ chmod 0744 your_file.py
-rwxr--r-- your_file.py
并将python的路径添加为your_file.py
的第一行:
#!/usr/bin/python
或(在我的情况下):
#!/usr/local/bin/python
一旦你这样做,而不是像这样运行它:
$ python your_file.py
您可以像这样运行:
$ ./your_file.py
甚至将其重命名为yourfile
并按以下方式运行:
$ ./yourfile
如果您然后将yourfile
复制到您的bin(即#!/usr/bin/
或#!/usr/local/bin/
)
你可以像这样运行它:
$ yourfile
然后你可以......
使用raw_input()
征求用户的意见并获取意见。
your_file.py
:
#!/usr/local/bin/python
import os
while(True):
# cntrl-c to quit
input = raw_input('your_prompt$ ')
input = input.split()
if input[0] == 'ls':
dire = '.'
if len(input) > 1:
dire = input[1]
print('\n'.join(os.listdir(dire)))
else:
print('error')
your_file.py
使用示例:
$ chmod 744 your_file.py
$ cp your_file.py /usr/local/bin/your_file
$ your_file
your_prompt$ ls
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
your_prompt$ ls .
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
your_prompt$ pwd
error
your_prompt$ ^CTraceback (most recent call last):
File "/usr/local/bin/your_file", line 7, in <module>
input = raw_input('your_prompt$ ')
KeyboardInterrupt
$
运行脚本时从命令行中使用sys.argv
获取参数:
list_argv.py
:
#!/usr/local/bin/python
import sys
print(sys.argv)
list_argv.py
使用示例:
$ python list_argv.py
['list_argv.py']
$ python list_argv.py hello
['list_argv.py', 'hello']
$ python list_argv.py hey yo
['list_argv.py', 'hey', 'yo']
$ chmod 744 list_argv.py
$ ./list_argv.py
['./list_argv.py']
$ ./list_argv.py hi
['./list_argv.py', 'hi']
$ ./list_argv.py hey yo
['./list_argv.py', 'hey', 'yo']
$ cp list_argv.py /usr/local/bin/list_argv
$ list_argv hey yo
['/usr/local/bin/list_argv', 'hey', 'yo']
将raw_input()
替换为sys.argv
。
&#39; your_ls.py&#39;:
#!/usr/local/bin/python
import sys
import os
dire = '.'
if len(sys.argv) > 1:
dire = sys.argv[1]
print('\n'.join(os.listdir(dire)))
&#39; your_ls.py&#39;使用示例:
$ chmod 744 your_ls.py
$ cp your_ls.py /usr/local/bin/your_ls
$ your_ls
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
$ your_ls .
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
$ your_ls blah
Traceback (most recent call last):
File "/usr/local/bin/your_ls", line 9, in <module>
print('\n'.join(os.listdir(dire)))
OSError: [Errno 2] No such file or directory: 'blah'
使用subprocess.Popen
从命令行访问任何内容。
your_subprocess.py
:
#!/usr/local/bin/python
import os
import subprocess
while(True):
# cntrl-c to quit
input = raw_input('your_prompt$ ')
process = subprocess.Popen(input, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = process.communicate()
print(out)
print(err)
your_subprocess.py
使用示例:
$ chmod 744 your_subprocess.py
$ cp your_subprocess.py /usr/local/bin/your_subprocess
$ your_subprocess
your_prompt$ ls
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
your_prompt$ ls .
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
your_prompt$ pwd
/Users/ox/_workspace/cmd_ln
your_prompt$ blah
/bin/sh: blah: command not found
your_prompt$ ^CTraceback (most recent call last):
File "/usr/local/bin/your_subprocess", line 8, in <module>
input = raw_input('your_prompt$ ')
KeyboardInterrupt
$
BREAK STUFF!
: - d
很有趣!
-OX
答案 1 :(得分:18)
真正的命令行程序属于ls
或grep
;它是从命令行启动的,但它是非交互式的,可以在管道中使用,并与其他程序结合使用。典型的命令行程序没有交互式用户体验,而是依赖shell的历史记录和init文件进行自定义。
您要创建的是 curses 应用程序,该应用程序使用TTY的全部功能作为交互式平台,无论好坏。为此,请查看curses。
答案 2 :(得分:9)
您应该查看cmd模块。
有关其使用的示例,请参阅Python Cookbook。
答案 3 :(得分:3)
执行交互式控制台应用程序的最简单方法是:
while True:
command = raw_input('command? ').strip()
if command == 'say_hello':
print('Hello')
elif command == 'other_thing':
print('Doing something else')
elif command == 'quit':
break
else:
print('Invalid Command.')
这是基本结构。如果你想要更像vim的东西,你可能需要使用curses库。
答案 4 :(得分:0)