我试图弄清楚如何在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>
感谢您抽出宝贵的时间阅读所有内容,如果我能找到答案的话,会让我非常高兴!现在已经挣扎了几天,无法掌握。
答案 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