在 Python 3 中使用 sys.argv 和 Python 解释器

Using sys.argv in Python 3 with Python interpreter

我正在尝试弄清楚如何在 Python 3.6 中使用 sys.argv,但无法弄清楚如何使用 Python 解释器(我'我什至不能 100% 确定我真的在使用解释器,对解释器、shell、终端等的术语有点困惑)

问题 1要访问 Python 解释器,我可以简单地在终端中输入 $ python 吗(我是在 Mac) 上?如果没有,我该如何访问它?

似乎当我在我的文件中寻找我认为是解释器的东西时(我已经通过 Anaconda 下载 Python),我找到了一个名为“pythonw”的程序,并启动它启动终端,看起来 Python 解释器已经 运行ning。这是翻译吗?下面的代码块是当我 运行 “pythonw” 程序 window 时在终端 window 中打印的内容:

Last login: Tue Aug  7 18:26:37 on ttys001
Users-MacBook-Air:~ Username$ /anaconda3/bin/pythonw ; exit;
Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:14:23) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

问题 2:假设我有 Python 解释器 运行ning 以便于讨论。还假设我将以下 script/module 保存为 test.py.

import sys 
print('Number of arguments:', len(sys.argv), 'arguments.')
print('Argument List:', str(sys.argv))

如果我简单地在解释器的命令行中导入这个模块,我得到打印输出:

参数数量:1 个参数。 参数列表:['']

但是我实际上如何在命令行中为模块提供参数?

我在网上找了一圈,都显示this way在做,但是没有用。

问题 3: sys.argv 是否只能在解释器的命令行中写入参数时使用,或者有没有办法在 Spyder 中为模块提供参数?

感谢您花时间阅读所有内容,如果我能得到答案,我会很高兴!纠结了好几天都抓不住

Python 解释器只是一段翻译和运行Python 代码的代码。您可以通过不同的方式与它互动。最直接的可能是将一些 Python 代码放入文件中,并将其作为第一个参数传递给 python:

bash$ cat <<\: >./myscript.py
from sys import argv
print(len(argv), argv[1:])
:
bash$ # in real life you would use an editor instead to create this file
bash$ python ./myscript.py one two three
4 ['one', 'two', 'three']

如果你不想把脚本放在一个文件中,也许是因为你只是需要快速检查一些东西,你也可以传递 Python 一个 -c 命令行选项,其中选项参数是一个包含您的 Python 代码的字符串,并且任何非选项参数都像以前一样在 sys.argv 中暴露给该代码:

bash$ python -c 'from sys import argv; print(len(argv), argv[1:])' more like this
4 ['more', 'like', 'this']

(单引号可能对 Bash 最有意义。其他一些 shell 使用其他约定将一段较长的文本包装为单个字符串;特别是,Windows 的工作方式不同。)

在这两种情况下,Python 解释器都是以要执行的程序启动的;它解释并执行了 Python 程序,然后它退出了。如果您想在交互式 Read-Eval-Print-Loop(通常缩写为 REPL)中更直接地与 Python 对话,那么当您只键入 python:

时就会发生这种情况
bash$ python
Python 3.5.1 (default, Dec 26 2015, 18:08:53)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+2
3
>>> 

如您所见,您在 >>> 提示符下键入的任何内容都会被读取、评估和打印,并且 Python 循环回到 >>> 以表明它已准备好再来一遍。 (如果您键入不完整的内容,提示将更改为 ...。有时需要费点劲才能找出缺少的内容 - 可能是缩进或右括号与您在之前输入的左括号一起使用行,例如。)

没有什么 本身 可以阻止您自己给 sys.argv 赋值:

>>> import sys
>>> sys.argv = ['ick', 'poo', 'ew']

此时,您可以import您上面创建的脚本文件,它会显示第一个之后的参数;

>>> import myscript
3, ['poo', 'ew']

您会注意到代码忽略了 sys.argv 的第一个元素,它通常包含脚本本身的名称(如果您使用 python -c '...',则为 -c)。

...但是与您 import 的模块交谈的常用方法是找到它的主要功能并使用显式参数调用它。所以如果你有一个脚本 otherscript.py 并检查它的内容,它可能在接近尾声的地方包含如下内容:

def main():
    import sys
    return internal_something(*sys.argv[1:])

if __name__ == '__main__':
    main()

所以你可能会简单地

>>> import otherscript
>>> otherscript.internal_something('ick', 'poo')

您的第一个脚本不需要具有这种结构,但这是一种足够常见的安排,您应该习惯于看到它;事实上,我们这样做的原因之一是我们可以 import 编码而无需立即启动 运行。当您导入包含此代码的文件时,if __name__ == '__main__' 条件专门评估为 False,因此您可以控制它在 import 下与直接 python myscript.py 时的行为方式。

回到您的问题,让我们仍然从典型的 IDE.

研究如何做到这一点

IDE 通常可以让您免受这些事情的影响,并且只允许您编辑文件并显示当 IDE 对 Python 中的代码运行 Python 解释器时发生的情况文件。当然,在幕后,IDE 会在您按下“执行”按钮时做一些与 python filename.py 非常相似的事情(或者它会显示这个;可能是一个功能键或菜单项)。

模拟我们上面所做的事情的一种方法是编辑 IDE 中的两个文件。鉴于上面的 myscript.py,第二个文件可以被称为 iderun.py 并且包含我们提交给上面的 REPL 的相同代码。

import sys
sys.argv = ['easter egg!', 'ick', 'poo', 'ew']
import myscript