导入 sys 后列表 "sys.argv" 为空

List "sys.argv" empty after import sys

我有一个包含以下导入的脚本:

import os
import sys
import numpy as np
import netCDF4
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap


sc = sys.argv[1]
run = sys.argv[2]

...

当我 运行 它返回以下错误消息时:

Traceback (most recent call last):

  File "/home/brandonsmith/climate-sensitivity-gcm/plot_scripts/map_lowcloud.py", line 11, in <module>
    sc = sys.argv[1]

IndexError: list index out of range

所以我检查了列表内容,结果是空的:

In [28]: sys.argv
Out[28]: ['']

为什么?

当您从命令行提示符 运行 程序时,它会从命令行程序接收参数(shell 程序,例如 *nix 中的 bash,cmd 提示符Windows)。一个例子可能会有所帮助:

> python my_program Brandon GreenMatt

在这种情况下,您告诉命令行程序 运行 python。您给 python 的参数是 "my_program"、"Brandon" 和 "GreenMatt"。反过来,python 尝试找到并 运行 一个名为 "my_program" 的程序,它将接收参数 "Brandon" 和 "GreenMatt".

Python 处理参数的机制是 sys.argv。第一个参数 - 编号为 0,即 sys.argv[0] - 将是程序名称。其他参数将按照它们在命令行中出现的顺序加载到 sys.argv 中。因此,在我上面给出的示例中,my_program 将在 sys.argv[1] 中看到 "Brandon",而 sys.argv[2] 将保持 "GreenMatt".

当命令行没有参数时,例如:

> python my_program

然后 sys.argv[1] 和 sys.argv[2] 将没有任何内容,导致您看到的错误。此外,如果您将程序加载到某种 Python 交互式环境中并且只是 运行 它,您将看到此错误。

the docs 中的更多内容。

对于使用 Python 交互式环境(即 Spyder、Jupyter)的任何人,您需要指定命令行选项。我正在使用 Spyder,所以这可以通过在 "run tab" 下找到 "configurations per file" 按钮,然后选择 "command line options" 并输入 运行 命令之后的内容来完成。感谢发布已接受答案的人。