在脚本中手动设置 sys.argv[1]

  • 本文关键字:argv sys 设置 脚本 python
  • 更新时间 :
  • 英文 :


来自 Matlab(Python 新手(我习惯于在某些情况下手动"作弊"设置varargin......我需要调整一些代码,并希望保持行ASDF=...BSDF=...不变。为此,我想设置 sys.argv[1]...可以这样做吗,这是否被视为不良做法?

#read ASDF and BSDF from a text file, with the section that is specified by the argument provided
if len(sys.argv) == 1:
sys.argv[1]='DEFAULT'
print('Using ' + sys.argv[1]):
ASDF =   config.get(sys.argv[1],'ASDF');
BSDF =   config.get(sys.argv[1],'BSDF');
elif len(sys.argv) == 2:
print('Using ' + sys.argv[1]):
ASDF =   config.get(sys.argv[1],'ASDF');
BSDF =   config.get(sys.argv[1],'BSDF');
else:
print('too many inputs, don''t confuse me...')
quit()

也许你应该使用默认的 argparse 模块进行参数解析: https://docs.python.org/3/library/argparse.html

我不是 100% 确定我理解你想做什么,但这里有一个试探性的解决方案:

#read ASDF and BSDF from a text file, with the section that is specified by the argument provided
import argparse
parser = argparse.ArgumentParser(description="My argument parser")
parser.add_argument('some_argument')
parser.add_argument('section', nargs='?', default="DEFAULT")
args = parser.parse_args() # Will parse sys.argv by default
section = args.section
print('Using ' + section)
ASDF =   config.get(section,'ASDF');
BSDF =   config.get(section,'BSDF');

当 arugments 的数量不正确时,Argparse 将管理错误。语法也可能更接近您在 matlab 中知道的语法。

TL;DR 不要使用sys.argv;使用argparse.


你现在正在做的事情不需要设置sys.argv[1];只需在你本来使用它的地方使用"DEFAULT"

if len(sys.argv) == 1:
print('Using DEFAULT'):
ASDF = config.get('DEFAULT', 'ASDF');
BSDF = config.get('DEFAULT', 'BSDF');
elif len(sys.argv) == 2:
print('Using ' + sys.argv[1]):
ASDF = config.get(sys.argv[1],'ASDF');
BSDF = config.get(sys.argv[1],'BSDF');
else:
print('too many inputs, don''t confuse me...')
sys.exit(1)

如果要分解对config.get的调用,则设置sys.argv[1]很有用,例如,

if len(sys.argv) == 1:
# there is no sys.argv[1] to assign to;
# you need to append to the list.
sys.argv.append('DEFAULT')
elif len(sys.argv) > 2:
sys.exit(1)
print('Using ' + sys.argv[1]):
ASDF = config.get(sys.argv[1],'ASDF');
BSDF = config.get(sys.argv[1],'BSDF');

也就是说,一般来说,您不会直接使用sys.argv。使用argparse,就像QuantumLicht的答案一样。

虽然可以通过设置设置sys.argv = [...]来做到这一点(也许,它已经 自从我使用python以来有一段时间(,这样做肯定会被认为是不好的做法。

变量 sys.argv 是 C 的延续。 在 C 语言中,程序的主要功能如下所示:

int main(int argc, char *argv[]) {
...
}

加载程序时,传递给程序的参数将加载到连续的内存块中,并且假设在已为参数分配的空间之后有任何额外的空间是不安全的。 由于要分配给参数的值可能是比原始参数长的字符串,或者可能是程序启动时使用的最后一个参数之后的参数,因此执行类似操作可能会损坏程序的内存或触发某种内存访问异常(在 C 中(。

最新更新