【问题标题】:I'd like my code to flow with my terminal a little better我希望我的代码更好地与我的终端一起流动
【发布时间】:2013-07-02 17:01:20
【问题描述】:

所以我在 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

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

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

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] 并在 first 和 second 上执行操作。这可以实现吗?

【问题讨论】:

    标签: python linux python-2.7


    【解决方案1】:

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

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

    【讨论】:

    • 你怎么回答得这么快?天哪。
    • 哈哈是的,这是一个相当快的回复,我印象深刻!但是好的,这看起来很有希望,我会继续阅读文档,谢谢
    • @enginefree:我认为他制作了一个 python 模块来检查更新,可能使用 Python 制作了一种更好的模板语言来编写更好的答案。又或者是两个人共用一个账号,皮特斯先生的谜团将永远是个谜! :P
    【解决方案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) &lt; 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)(或其他一些非零值...)。

    【讨论】:

    • 哦,哇,很抱歉我完全绕过了你的答案,它实际上回答得最好。非常感谢!
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你或许可以使用 sys.argv:

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

      别忘了之前检查len(sys.argv)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-15
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 2022-11-16
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多