Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使参数(来自Bash)非可选_Python_Bash_Shell_Parameters - Fatal编程技术网

在Python中使参数(来自Bash)非可选

在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

对于Python,我几乎是一个完全的新手,通过谷歌搜索,可以获得很多关于参数的信息。。。但不是这个具体问题

但问题是:有没有一种简单的方法可以让Python脚本在从脚本外部调用时需要一个变量(例如Bash)?我意识到我可以在sys.argv上测试,但它看起来确实是一个笨拙的解决方案

例如,我是否可以构造此脚本,以便必须传递sys.argv[1]才能使用该脚本,而不在此处对其进行测试

#!/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,因为这将在以后的代码中使用。避免它似乎是荒谬的
没有在argv上运行“测试”的答案是我所知道的最好的答案。至少在这里我们没有看到argv[1]:



这里有一个使用
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()中,但存在(或不存在)of
argv
仅表明您已经导入了它,这在本文中不是很有用。我意识到这不是最好的解决方案,所以我提交了一个新的答案。但我觉得把这个忘了还是有用的。但是,是的,我同意你的看法。@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