在 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
我正在尝试弄清楚如何在 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