首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在脚本中手动设置sys.argv[1]

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

Stack Overflow用户
提问于 2019-11-27 20:51:47
回答 3查看 443关注 0票数 0

来自Matlab (新增python),在某些情况下,我习惯于“欺骗”一些手动设置varargin .我需要修改一些代码,希望ASDF=...BSDF=...行保持不变。为此,我想设置sys.argv1.能否做到这一点,这是否被认为是不好的做法?

代码语言:javascript
复制
#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()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-27 21:36:44

不要使用sys.argv;使用argparse

您现在所做的并不需要设置sys.argv[1];只要在您使用它的地方使用"DEFAULT"即可。

代码语言:javascript
复制
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)

设置sys.argv[1]是非常有用的,例如,如果您想要对config.get的调用进行因子化,

代码语言:javascript
复制
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's answer中一样。

票数 1
EN

Stack Overflow用户

发布于 2019-11-27 21:27:28

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

我不能百分之百肯定我理解你想要做的事情,但以下是一个暂时的解决方案:

代码语言:javascript
复制
#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');

当集合数不正确时,Argparse将管理错误。语法也可能更接近于您在matlab中所知道的内容。

票数 2
EN

Stack Overflow用户

发布于 2019-11-27 21:29:18

虽然可以通过设置sys.argv = [...] (可能,我使用python已经有一段时间了)来实现这一点,但是这样做肯定会被认为是错误的做法。

变量sys.argv是C语言中的一个保持器,在C中,程序的主要功能如下所示:

代码语言:javascript
复制
int main(int argc, char *argv[]) {
    ...
}

当程序被加载时,传递给程序的参数被加载到一个连续的内存块中,在已经为参数分配的空间之后,假设存在任何额外的空间是不安全的。由于要分配给参数的值可能是比原始参数长的字符串,或者是程序启动后的参数,这样做可能会损坏程序的内存或触发某种类型的内存访问异常(在C中)。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59078249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档