目录
1, 可执行的对象声明和内建函数
1-1, callable()
通过callable(obj), 判断一个对象是否可调用,可调用返回True;否则返回False
In [6]: callable(dir)
Out[6]: True
1-2, compile()
通过compile(参数1, 参数2, 参数3), 将python代码生成为代码对象, 生成的代码对象就可以供exec(), eval()直接使用
参数1:为要编译的python代码
参数2:默认值为空串,表示存放代码对象的文件名字
参数3:'eval'或'single'或'exec'
'eval',可求值的表达式, 与eval一起使用
# 可求值表达式
In [7]: eval_code = compile('1+6', '', 'eval')
In [8]: eval(eval_code)
Out[8]: 7
'single',单一的执行语句,与exec一起使用
# 单一可执行语句, 注意这里的第一个参数是用引号括起来的语句,而不是字符串
In [10]: single_code = compile("print('hello, python')", '', 'single')
In [11]: exec(single_code)
hello, python
'exec', 可执行的语句组,与exec一起使用
# 可执行语句组
In [16]: exec_code = compile("""
...: req = input('Count how many numbers?')
...: for each_num in range(int(req)):
...: print('each_num:', each_num)""", '', 'exec')
In [17]:
In [17]: exec(exec_code)
Count how many numbers?10
each_num: 0
each_num: 1
each_num: 2
each_num: 3
each_num: 4
each_num: 5
each_num: 6
each_num: 7
each_num: 8
each_num: 9
1-3, eval()
通过eval(), 对字符串形式的表达式进行求值
In [19]: eval('123')
Out[19]: 123
In [20]: eval('1+9')
Out[20]: 10
# 注意:若eval中不是数字表达式,会报错
In [23]: eval('fdsa')
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[23], line 1
----> 1 eval('fdsa')
File <string>:1
NameError: name 'fdsa' is not defined
1-4, exec()
通过exec(), 用于执行代码对象或者字符串形式的python代码
In [26]: exec("""
...: x = 0
...: print('x is currently:', x)
...: while x < 5:
...: x += 1
...: print('incrementing x to:', x)
...: """)
x is currently: 0
incrementing x to: 1
incrementing x to: 2
incrementing x to: 3
incrementing x to: 4
incrementing x to: 5
# exec接收一个文件对象
In [42]: f = open(r'C:\Users\Administrator\Desktop\1121.py')
# f.read()为读取到的python源代码
In [43]: exec(f.read())
x is currently: 0
incrementing x to: 1
incrementing x to: 2
incrementing x to: 3
incrementing x to: 4
incrementing x to: 5
2, 执行其他程序
2-1, 执行非python程序
2-1-1, os.system()
通过os.system(cmd), 用于执行cmd命令,执行期间python挂起,等待cmd执行完成后,python继续执行
In [10]: result = os.system('ipconfig')
Windows IP 配置
未知适配器 本地连接:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::6481:4d49:134:9d3e%5
IPv4 地址 . . . . . . . . . . . . : 192.168.1.8
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.1.1
以太网适配器 VMware Network Adapter VMnet1:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::6ac7:3ac6:8269:2c79%4
IPv4 地址 . . . . . . . . . . . . : 192.168.11.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
以太网适配器 VMware Network Adapter VMnet8:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::9079:b8e4:1fd4:323c%6
IPv4 地址 . . . . . . . . . . . . : 192.168.188.12
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.188.2
# 注意,os.system(cmd)只返回状态码,0表示cmd正常执行,非0表示没有正常执行
In [11]: result
Out[11]: 0
2-1-1, os.popen()
通过os.popen(cmd), 可将输出信息报错到一个类文件对象中
# os.popen返回一个类文件对象,用于保存输出信息
In [24]: f = os.popen('ipconfig')
#通过像文件一样的操作,来读取输出的信息
In [25]: result = f.readlines()
In [26]: result
Out[26]:
['\n',
'Windows IP 配置\n',
'\n',
'\n',
'未知适配器 本地连接:\n',
'\n',
' 媒体状态 . . . . . . . . . . . . : 媒体已断开连接\n',
' 连接特定的 DNS 后缀 . . . . . . . : \n',
'\n',
'以太网适配器 以太网:\n',
'\n',
' 连接特定的 DNS 后缀 . . . . . . . : \n',
' 本地链接 IPv6 地址. . . . . . . . : fe80::6481:4d49:134:9d3e%5\n',
' IPv4 地址 . . . . . . . . . . . . : 192.168.1.8\n',
' 子网掩码 . . . . . . . . . . . . : 255.255.255.0\n',
' 默认网关. . . . . . . . . . . . . : 192.168.1.1\n',
'\n',
'以太网适配器 VMware Network Adapter VMnet1:\n',
'\n',
' 连接特定的 DNS 后缀 . . . . . . . : \n',
' 本地链接 IPv6 地址. . . . . . . . : fe80::6ac7:3ac6:8269:2c79%4\n',
' IPv4 地址 . . . . . . . . . . . . : 192.168.11.1\n',
' 子网掩码 . . . . . . . . . . . . : 255.255.255.0\n',
' 默认网关. . . . . . . . . . . . . : \n',
'\n',
'以太网适配器 VMware Network Adapter VMnet8:\n',
'\n',
' 连接特定的 DNS 后缀 . . . . . . . : \n',
' 本地链接 IPv6 地址. . . . . . . . : fe80::9079:b8e4:1fd4:323c%6\n',
' IPv4 地址 . . . . . . . . . . . . : 192.168.188.12\n',
' 子网掩码 . . . . . . . . . . . . : 255.255.255.0\n',
' 默认网关. . . . . . . . . . . . . : 192.168.188.2\n']