【问题标题】:Using sys.argv in Python 3 with Python interpreter在 Python 3 中使用 sys.argv 和 Python 解释器
【发布时间】:2019-01-14 20:54:36
【问题描述】:

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

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

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

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 解释器以进行论证。还假设我将以下脚本/模块保存为 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-3.x command-line command-line-arguments interpreter sys


    【解决方案1】:

    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
    >>> 
    

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

    没有什么本身可以阻止您自己为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 解释器时会发生什么。当然,在幕后,当您点击 Execute 按钮时,IDE 会执行与 python filename.py 非常相似的操作(或者它显示的内容;可能是功能键或菜单项)。

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

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

    【讨论】:

    • 非常感谢!不过还是不明白。当您编写“...并将其作为第一个参数传递给python”时,python 是什么意思?会不会像 Spyder IDE 一样?也仍然不明白如何让我的 test.py 显示例如“参数数量:3。参数列表:['ick','poo','ew']”。这是主要目标。我知道如何导入脚本然后使用这些脚本中的函数,但从我所看到和尝试的情况来看,sys.argv 似乎与此无关?在导入脚本然后使用其函数时,似乎没有任何方法可以使用 sys.argv?
    • Spyder IDE 显然基本上等同于这里的 REPL。就像我在答案中所说的那样,如果没有更好的方法来实现您想要的,您可以在import 之前将sys.argv 设置为 REPL 中的某些内容。
    • 你的问题只是间接地提到了 Spyder;这不是我熟悉的工具,但我认为它不是您目标的核心。如果您真的想具体了解 Spyder,也许在这一点上一个更好、更集中的问题将是最好的前进路线。 (一般来说,您应该避免提出多个问题;一个好的 Stack Overflow 问题应该定义得足够明确,以便您可以轻松判断任何给定的答案是否可以接受。)
    • 你提到了终端,所以我假设你对此有基本的了解。打开终端窗口将启动你的 shell(默认为 Bash),它也是一个 REPL,而不是 Python REPL。要从 Bash 启动 Python,请在 Bash 提示符下键入 python(可以选择带参数,就像我在答案中显示的那样)。
    • @Frankie 我用几段更新了答案。希望现在更清楚了。
    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2011-02-13
    • 2016-05-23
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多