2. 使用Python解释器

2. 使用Python解释器

2.1 调用解释器


2.1.1 传入参数


解释器会读取命令行参数,转化为字符串列表存入 sys 模块中的 argv 变量中.执行命令 import sys 你可以导入这个模块并访问这个列表.

Test.py

import sys
print(sys.argv)

使用命令行传入并调用Test.py:

chenxiaoweideMacBook-Pro:2.1.1 chenxiaowei$ python /Users/chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py   1 2 4 5 5 6 

运行结果:

['/Users/chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1/Test.py', '1', '2', '4', '5', '5', '6']

sys.argv[0] 的 值为执行脚本的路径

在命令行中使用不同的路径调用脚本sys.argv[0]的值:

在不同的路径下采用绝对路径调用Test.py :

chenxiaoweideMacBook-Pro:~ chenxiaowei$ python /Users/chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py

/Users/chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1/Test.py
chenxiaoweideMacBook-Pro:2.1.1 chenxiaowei$ python /Users/chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py 

/Users/chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1/Test.py

采用绝对路径调用Test.py他们的sys.argv[0]是一样的

在不同路径下采用相对路径调用Test.py:

chenxiaoweideMacBook-Pro:users chenxiaowei$ python chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py  

chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1/Test.py
chenxiaoweideMacBook-Pro:2.1.1 chenxiaowei$ python Test.py 

Test.py

采用相对路径调用Test.py他们的sys.argv[0]是不同的

但是看以上二者的 共同之处在于你给他传什么他就输出什么(不知道是不是这样设定的, 但是可以这样记忆)


在命令行中执行Python语句:

chenxiaoweideMacBook-Pro:users chenxiaowei$ python -c "print('test')"

test
chenxiaoweideMacBook-Pro:users chenxiaowei$ python -c "import sys;print(sys.argv[0])"

-c

使用python -c commend命令来执行语句, commend 是你想要的执行的python语句, 最好使用双引号包括起来, 里面字符串使用单引号包起来, 要是二者交换在Windows下是不能行的, Mac下倒是可以.


在命令行中使用模块执行:

chenxiaoweideMacBook-Pro:2.1.1 chenxiaowei$ python -m Test

/Users/chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1/Test.py

在命令行中直接执行:

chenxiaoweideMacBook-Pro:2.1.1 chenxiaowei$ python Test.py

Test.py
chenxiaoweideMacBook-Pro:2.1.1 chenxiaowei$ python Test.py
['/Users/chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']
chenxiaoweideMacBook-Pro:2.1.1 chenxiaowei$ python -m Test
['/Users/chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']

这样看二者是没有区别的, 且二者都把当前的运行目录的路径加入到了sys.path中, 且都可以执行

chenxiaoweideMacBook-Pro:TestCase chenxiaowei$ python -m Test

/usr/local/bin/python3.7: No module named Test
##################
chenxiaoweideMacBook-Pro:TestCase chenxiaowei$ python -m 2.1.1/Test

/usr/local/bin/python3.7: No module named Test

把路径向上调整一级, 发现并不能执行此语句, 因为找不到此模块

总结: 搜索模块从sys.path的路径里面搜索, 且只搜索当前路径的文件夹下, 二者的区别在于sys.path不同,其实二者也都加了路径, 一个加的是脚本所在的路径, 一个加的是当前运行所在路径, 所以只是模块只会在当前path中有的路径下一级去找, 或是 当前路径 + XXX.XXX 的模块; 另外发现这只在命令行中是这样, 如果模块在代码中通过from和import导入是不会把当前运行路径加入到sys.path中的只会有当前运行的py所在的路径加入进去,所以会有这样的情况:最外面的py能执行里面的py, 里面的py不能单独执行,因为路径找不到,可能只能通过外面的路径一层一层的通过相对路径执行到里面的py模块

2.1.2 交互模式


通过在命令行中输入 python 进入交互模式, 进入交互模式会显示 >>> 来指示输入下一条指令, 如果要输入多行的指令的话, 它会使用 ... 来提醒输入.

chenxiaoweideMacBook-Pro:~ chenxiaowei$ python

Python 3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> if 1==1:
...     print("sss")
... 
sss

2.2 解释器的运行环境


2.2.1 源文件的字符编码


默认情况下, Python源码文件以 UTF-8 编码方式处理.

如何修改默认编码格式呢? 在第一行写如下特殊的注释

# -*- coding: encoding -*-

encoding 可以是Python支持的任意一种codecs.

查阅资料说是: python3 是默认UTF-8 所以我没有设置也可以显示中文, python2 应该是默认是 ASCII 字符

*除此之外也存在第一行被占用, 写在第二行的情况:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

可以看到第一行被#!/usr/bin/env python3占用, 其作用是制定启用什么版本的python解释器 来执行, 这个是UNIX的 shebang


拓展:

#!/usr/bin/env python3#!/usr/bin/python3的区别:

第一种通过寻找环境变量中的路径来执行, 第二种就相当于绝对路径指定哪个解释器.

还可以通过命令行来指定版本的python解释器:

Test.py:

import sys
print(sys.version)

命令行中运行结果:

chenxiaoweideMacBook-Pro:bin chenxiaowei$ python2.7 /Users/chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py 

2.7.10 (default, Feb 22 2019, 21:55:15) 
[GCC 4.2.1 Compatible Apple LLVM 10.0.1 (clang-1001.0.37.14)]
chenxiaoweideMacBook-Pro:bin chenxiaowei$ python3 /Users/chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py 

3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43) 
[Clang 6.0 (clang-600.0.57)]

可以使用这个命令行指定版本来验证上面默认的编码格式:

Test.py:

print("哈咯")

分别运行结果:

chenxiaoweideMacBook-Pro:bin chenxiaowei$ python2.7 /Users/chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py 

  File "/Users/chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1/Test.py", line 1
SyntaxError: Non-ASCII character '\xe5' in file /Users/chenxiaowei/Desktop/Study/Study PDF/Python/Python官方文档/TestCase/2.1.1/Test.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
chenxiaoweideMacBook-Pro:bin chenxiaowei$ python3 /Users/chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py 

哈咯

加入指定编码格式之后:

Test.py:

# -*- coding: UTF-8 -*-
print("哈咯")

运行结果:

chenxiaoweideMacBook-Pro:bin chenxiaowei$ python2.7 /Users/chenxiaowei/Desktop/Study/Study\ PDF/Python/Python官方文档/TestCase/2.1.1/Test.py 

哈咯
发布了73 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/daguniang123/article/details/103934787