我希望我的代码可以更好地与我的终端一起流动

时间:2013-07-04 16:06:44

标签: python linux python-2.7

所以我在Ubuntu 12.04上运行了一个功能齐全的py脚本,一切都很棒。除了我不喜欢我的输入法,它会变得烦人,你会在下面看到。在我输入代码之前,我应该说代码采用.img格式的两个图像,然后对它们进行计算。这就是我所拥有的:

import os

first = raw_input("Full path to first .img file: ")
second = raw_input("Full path to second .img file: ")

print " "


if os.path.exists(first) == True:
    if first.endswith('.img') == False:
        print 'You did not give a .img file, try running again'
        os.sys.exit()
elif os.path.exists(second) == True:
    if second.endswith('.img') == False:
        print 'You did not give a .img file, try running again'
        os.sys.exit()
else:
    print "Your path does not exist, probably a typo. Try again"
    os.sys.exit()

这就是我想要的;我希望能够直接从终端输入python这个输入。换句话说,我希望能够在终端输入类似

的内容
python myscript.py with the two images as input

这样我可以在指定路径和内容时使用终端的tab键快捷键。有什么想法/建议吗?

编辑:好的,所以我查看了解析,我想我已经知道了如何使用它。这是我的代码:

import argparse

import nipy

parser = argparse.ArgumentParser()



parser.add_argument("-im", "--image_input", help = "Feed the program an image", type =     nipy.core.image.image.Image, nargs = 2)

但是现在我希望能够在脚本中使用这些文件,比如first = parser [0] second = parse [1],并在第一个和第二个上执行操作。这可以实现吗?

4 个答案:

答案 0 :(得分:7)

您希望解析命令行参数,而不是在程序启动后读取输入。

使用argparse module,或自己解析sys.argv

答案 1 :(得分:2)

看到解析代码已经存在,您需要做的就是接受Python sys module的命令行参数:

import sys

first  = sys.argv[1]
second = sys.argv[2]

或者,更一般地说:

import os
import sys

if __name__ == '__main__':

    if len(sys.argv) < 2:
        print('USAGE: python %s [image-paths]' % sys.argv[0])
        sys.exit(1)

    image_paths = sys.argv[1:]

    for image_path in image_paths:
        if not os.path.exists(image_path):
            print('Your path does not exist, probably a typo. Try again.')
            sys.exit(1)
        if image_path.endswith('.img'):
            print('You did not give a .img file, try running again.')
            sys.exit(1)

注意

答案的第一部分为您提供了接受命令行参数所需的内容。第二部分介绍了一些有用的概念来处理它们:

  1. 将python文件作为脚本运行时,全局变量__name__设置为'__main__'。如果使用if __name__ == '__main__'子句,则可以将python文件作为脚本运行(在这种情况下执行子句)或将其作为模块导入(在这种情况下不会)。您可以阅读更多相关信息here

  2. 通常打印用法消息并在脚本调用错误时退出。 变量sys.argv设置为命令行参数列表,其第一项始终是脚本路径,因此len(sys.argv) < 2表示没有传递参数。如果您只想要两个参数,则可以使用len(sys.argv) != 3代替。

  3. sys.argv[1:]包含实际的命令行参数。如果您只想要两个参数,则可以通过sys.argv[1]sys.argv[2]来引用它们。

  4. 请不要使用if os.path.exists(...)==Trueif string.endswith(...)==True语法。写if os.path.existsif string.endswith(...)代替更加清晰,更加Pythonic。

  5. 使用不带参数的exit()默认为exit(0),这意味着程序已成功终止。如果您要退出并显示错误消息,则应使用exit(1)(或其他一些非零值...)。

答案 2 :(得分:1)

你想要做的是接受命令行参数,最好的方法是使用一个名为argparse的漂亮模块。我在下面列出了如何安装和使用它的好资源。

Here是argparse的绝佳资源。它是一个用于获取命令行参数的模块。

答案 3 :(得分:0)

您可以使用sys.argv:

import sys

first = sys.argv[1]
second = sys.argv[2]

不要忘记之前检查len(sys.argv)