在Python中使参数(来自Bash)非可选
对于Python,我几乎是一个完全的新手,通过谷歌搜索,可以获得很多关于参数的信息。。。但不是这个具体问题 但问题是:有没有一种简单的方法可以让Python脚本在从脚本外部调用时需要一个变量(例如Bash)?我意识到我可以在sys.argv上测试,但它看起来确实是一个笨拙的解决方案 例如,我是否可以构造此脚本,以便必须传递sys.argv[1]才能使用该脚本,而不在此处对其进行测试在Python中使参数(来自Bash)非可选,python,bash,shell,parameters,Python,Bash,Shell,Parameters,对于Python,我几乎是一个完全的新手,通过谷歌搜索,可以获得很多关于参数的信息。。。但不是这个具体问题 但问题是:有没有一种简单的方法可以让Python脚本在从脚本外部调用时需要一个变量(例如Bash)?我意识到我可以在sys.argv上测试,但它看起来确实是一个笨拙的解决方案 例如,我是否可以构造此脚本,以便必须传递sys.argv[1]才能使用该脚本,而不在此处对其进行测试 #!/usr/bin/env python import string import random import
#!/usr/bin/env python
import string
import random
import sys
def RandomString(length=6):
x=''.join(random.choice(string.ascii_uppercase) for i in range(length))
return x
random.seed(sys.argv[1])
y=RandomString()
print y
这是一个非常丰富的资源,您应该阅读以下内容: 下面,我只是检查字符串中是否有任何内容。如果为空(未读入),它将打印到终端并退出
#!/usr/bin/env python
import string
import random
import sys
# testing argv[1]
if 'argv[1]' in locals():
print 'read in, no problem'
else:
print 'not read in...exiting'
exit()
fi
参考资料:
parser = argparse.ArgumentParser()
parser.add_argument('RandomSeed')
args = parser.parse_args()
random.seed(args.RandomSeed)
将上述代码用于bash中的代码行类似于:
python main.py thisisarandomstring
Argparse是解析命令行应用程序参数的好方法(并且是制作命令行应用程序时首选的或好的途径)。它会自动为您生成一些帮助页面和其他文档,并生成相应的错误,而无需您自己执行所有操作
查看一个非常好的教程 - Argparser不安全。“Argparse具有内置的魔术行为,可以猜测某个内容是参数还是选项。”“Argparse当前不支持禁用显示间参数。”参考:
- 您应该始终检查argv,因为这将在以后的代码中使用。避免它似乎是荒谬的李>
这里有一个使用
argparse
的可能解决方案,它允许任何字符串作为第一个参数。但是它有两个严重的问题:不能定义任何可选参数,这导致需要禁用-h/--help
选项。禁用选项的技术有点老套。查看源代码,仅将prefix_chars
设置为空字符串是不够的,而是将其第一个元素为空字符串的元组设置为空字符串。或者可能只是一个空序列。可能还有其他一些问题
from argparse import ArgumentParser
p = ArgumentParser(add_help=False, prefix_chars=("",))
p.add_argument("randomseed")
args = p.parse_args()
random.seed(args.randomseed)
然后一个电话
python main.py -foo
将args.randomseed
设置为字符串-foo
考虑到所有这些,我认为您将不得不接受您必须在脚本中验证sys.argv
至少有一个命令行参数,因为没有更好的方法让bash
检查您
try:
randomseed = sys.argv[1]
except IndexError:
# Do something here; I suggest just using a value that
# lets random.seed() invoke its default, no-argument behavior
randomseed = None
你知道你的问题是“我能写一个需要某个变量存在的脚本,而不写任何代码来确保变量存在吗?”对吗?如果我理解你的意思,你希望在脚本运行之前以某种方式检查这个要求。因此,这不是一个Python问题,而是一个shell问题。当参数丢失时,除了代码错误之外,参数如何是非可选的?如果不给它该参数,脚本如何运行?这会引起一个错误,对吗?这难道不是任何“需求”都会做的事情吗?如果你没有给它正确的参数,它会引发错误吗?所以真正的问题是:
您想要什么样的错误消息?
。除非我误解了您的帖子,否则这似乎正是我问您是否可以避免在argv上运行测试的问题。我正在查看KDEx发布的答案。对不起,我误解了你的意思。请参见下文。字符串argv[1]
不会作为键出现在locals()
返回的字典中。除非将import
语句从sys import argv更改为,否则即使argv
也不会出现在locals()中,但存在(或不存在)ofargv
仅表明您已经导入了它,这在本文中不是很有用。我意识到这不是最好的解决方案,所以我提交了一个新的答案。但我觉得把这个忘了还是有用的。但是,是的,我同意你的看法。@user2875994试图让它更清楚一点,如果这就是全部new@user2875994:注意,如果参数看起来像一个选项(以-
开头),则可以使用python main.py--randomstring
调用脚本,虽然我不认为这是一个理想的解决方案。@chepner你能跳上python聊天吗?我不懂你的编辑,也许你可以教我?我在文档中没有看到任何关于RandomSeed的内容。在代码中,它是否将参数“RandomSeed”连接到argv[1]?是add_argument()吗?如果是这样,如果我添加多个参数,我添加的第一个参数是否为argv[1],第二个参数是否为argv[2],等等。?同样,这可能是一个愚蠢的问题,但是解析一个参数意味着什么呢?谢谢。我不完全确定“参数是否以-
开头(或者解析器的前缀字符中的字符
关键字参数)?”@chepner:如果OP想要接受任何第一个命令行参数作为随机种子,那么
try:
randomseed = sys.argv[1]
except IndexError:
# Do something here; I suggest just using a value that
# lets random.seed() invoke its default, no-argument behavior
randomseed = None