31

我最近开始学习python。我用 Django 创建了一些基本的 webapps 并编写了一些简单的脚本。在使用 VIM 作为 Python IDE 之后,我真的爱上了“终端程序”(有官方术语吗?)。现在我能够做一些简单的事情,比如询问某人的年龄并将其打印到屏幕上。然而,这归结为运行一个 .py 脚本,并且在这个脚本完成之后,正常的 bash 返回。我想创建一个可以从命令行运行的程序,它可以提供与 VIM 相同的用户体验(您可以打开和关闭)。例如,我创建了一个简单的脚本来导入 RSS 提要。如果我可以打开我的终端输入我的程序名称 -> 程序将打开 -> 然后我想使用类似 :findsomething 的命令,那就太棒了。

总结:

  • 我将如何创建这样的程序?
  • 你会推荐什么样的模块、书籍或网站
4

5 回答 5

30

在 *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

'你的_ls.py':

#!/usr/local/bin/python

import sys
import os

dire = '.'
if len(sys.argv) > 1:
    dire = sys.argv[1]
print('\n'.join(os.listdir(dire)))

'your_ls.py' 使用示例:

$ 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
$

弄坏东西!

:-D

玩得开心!

-牛

于 2014-06-29T14:55:03.993 回答
23

真正的命令行程序类似于lsor grep; 它是从命令行启动的,但它是非交互式的,可以在管道中使用并与其他程序结合使用。典型的命令行程序没有交互式用户体验,而是依赖 shell 的历史记录和 init 文件进行自定义。

您想要创建的是一个curses应用程序,它使用 TTY 作为交互式平台的全部功能,无论好坏。为此,请查找curses

于 2013-06-27T20:40:24.873 回答
9

你应该看看cmd模块。

有关其使用示例,请参阅Python Cookbook 。

于 2013-06-27T21:45:21.460 回答
6

执行交互式控制台应用程序的最简单方法是:

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 库。

于 2013-06-27T20:48:10.497 回答
0

如果要为 UNIX 系统创建独立的二进制文件,请使用freeze. 如果您想要一个用于 Windows 系统的,请查看py2exe. 要控制屏幕上的输出位置,请使用该curses模块。

于 2013-06-27T20:36:46.437 回答