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

时间:2018-08-07 17:25:11

标签: python-3.x command-line command-line-arguments interpreter sys

我试图弄清楚如何在Python 3.6中使用sys.argv,但无法弄清楚如何使用Python解释器使其正常工作(我什至不能100%肯定我实际上在使用解释器,将术语与解释器,shell,终端等混淆了。

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

似乎,当我去寻找我认为是文件解释器的东西时(我已经通过Anaconda下载了Python),我找到了一个名为“ pythonw”的程序,然后启动了Terminal,看起来像是已经运行的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个参数。 参数列表:['']

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

我一直在Internet上四处查看,所有人都显示这样做的 this way ,但是它不起作用。

问题3:仅当在解释器的命令行中编写参数时,才可以使用sys.argv吗?例如,是否可以在Spyder中为模块提供参数? < / p>

感谢您抽出宝贵的时间阅读所有内容,如果我能找到答案的话,会让我非常高兴!现在已经挣扎了几天,无法掌握。

1 个答案:

答案 0 :(得分:2)

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命令行选项,其中option参数是包含以下内容的字符串:您的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的第一个元素,该元素通常包含脚本本身的名称(如果使用了-c,则为python -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解释器时发生的情况。当然,在幕后,当您按下“执行”按钮时,IDE会执行与python filename.py非常相似的操作(或者它会显示此内容;也许是功能键或菜单项)。

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

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