所以我在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],并在第一个和第二个上执行操作。这可以实现吗?
答案 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)
答案的第一部分为您提供了接受命令行参数所需的内容。第二部分介绍了一些有用的概念来处理它们:
将python文件作为脚本运行时,全局变量__name__
设置为'__main__'
。如果使用if __name__ == '__main__'
子句,则可以将python文件作为脚本运行(在这种情况下执行子句)或将其作为模块导入(在这种情况下不会)。您可以阅读更多相关信息here。
通常打印用法消息并在脚本调用错误时退出。
变量sys.argv
设置为命令行参数列表,其第一项始终是脚本路径,因此len(sys.argv) < 2
表示没有传递参数。如果您只想要两个参数,则可以使用len(sys.argv) != 3
代替。
sys.argv[1:]
包含实际的命令行参数。如果您只想要两个参数,则可以通过sys.argv[1]
和sys.argv[2]
来引用它们。
请不要使用if os.path.exists(...)==True
和if string.endswith(...)==True
语法。写if os.path.exists
和if string.endswith(...)
代替更加清晰,更加Pythonic。
使用不带参数的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)
。