甜萝 发表于 2022-9-6 19:33

python 初学进程的疑问

本帖最后由 paypojie 于 2022-9-6 19:41 编辑

                                                                                  python 子进程 subprocess

源码如下 来自 https://www.liaoxuefeng.com/wiki/1016959663602400/1017628290184064
import subprocess

print('$ nslookup www.python.org')
r = subprocess.call(['nslookup', 'www.python.org'])
print('Exit code:', r)理解如下:
因为要创建新进程 所以导入 subprocess模块
输出一段文本 '$ nslookup www.python.org'
subprocess.call 表示创建(启动)一个子进程 在子进程里进入cmd执行命令 nslookup www.python.org 效果如同截图那样



执行 subprocess.call() 方法会返回状态码 如果返回0 表示正确执行 成功
不知道上面这段代码理解准不准确

下面还有一段代码我感到疑惑
import subprocess
print('$ nslookup')
p = subprocess.Popen('nslookup',stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output,err = p.communicate(b'set q=mx\npython.org\nexit\n')
print(output.decode('utf-8'))
print('errcode' , p.returncode)第一行 第二行 太简单 就不解释了
第三行 p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
因为要创建子进程 所以 使用sub.popen()方法来启动一个子进程 在子进程里打开cmd程序 输入并且执行命令 'nslookup' 然后创建三个管道 分别是标准输入 输出 错误 管道                                                                                                
                                                                              ---------------不知道是不是这样理解的

p保存了返回后状态码 通过调用 returncode 方法来实现查看 返回0 表示 执行成功 没有出现问题 非0则表示有问题
最后一行 print('Exit code:', p.returncode) 把我上面的想法给实现并且打印


第四行 p.communicate() 表示和子进程进行交互 发送和输出数据
不过 output, err = p.communicate(b'set q=mx\npython.org\nexit\n') 我不知道 err保存了些什么
output 是保存了一个bytes类型数据


倒数第二行 print(output.decode('utf-8')) 这样会报错 截图如下




要改成这样 print(output.decode('gbk')) 才会正常输出 截图如下




我将utf-8改为gbk才会正常输出 不明白为什么

最后一行 print('Exit code:', p.returncode)
p.returncode 表示查看子进程执行完成的状态 如果返回1 表示执行成功

不理解的代码行如下

output,err = p.communicate(b'set q=mx\npython.org\nexit\n')
print(output.decode('gbk'))

期待各位大神的精彩回复 晚上回来之后会查看这个帖子并和各位讨论

Thinkx 发表于 2022-9-6 20:31

因为你用的是Windows,windows系统是用GBK编码的
原因可能是你那个文件不是 UTF8 编码的,或者文件路径中有中文

甜萝 发表于 2022-9-6 22:04

本帖最后由 paypojie 于 2022-9-6 22:05 编辑

Thinkx 发表于 2022-9-6 20:31
因为你用的是Windows,windows系统是用GBK编码的
原因可能是你那个文件不是 UTF8 编码的,或者文件路径中 ...
有回复了 激动 {:301_972:}{:17_1050:} {:301_972:}

zhi_huo 发表于 2022-9-6 22:15

https://blog.csdn.net/wang7807564/article/details/78164855

zhi_huo 发表于 2022-9-6 22:19

本帖最后由 zhi_huo 于 2022-9-6 22:21 编辑

https://blog.csdn.net/imzoer/article/details/8678029Python中subprocess学习_imzoer的博客-CSDN博客_python subprocess

甜萝 发表于 2022-9-6 23:02

zhi_huo 发表于 2022-9-6 22:15
https://blog.csdn.net/wang7807564/article/details/78164855

明天再细看

甜萝 发表于 2022-9-6 23:03

billsmiless 发表于 2022-9-6 22:28
帖子写的比较用心,继续加油💪🏻

还好 谢谢 {:300_969:}

puajose 发表于 2022-9-7 00:02

这不就是win的原因吗

Mahone1 发表于 2022-9-7 00:34

Thinkx 发表于 2022-9-6 20:31
因为你用的是Windows,windows系统是用GBK编码的
原因可能是你那个文件不是 UTF8 编码的,或者文件路径中 ...

你这句话解决了我很久以来的一个疑问,我以前用命令行批量转移文件到文件夹有时候转移失败,现在看来应该是编码问题,但是仔细一想也不对啊
我是用everything获得所有文件名,然后在excel里批量构造命令行,然后转成bat文件运行,文件名也是win的文件名,按理来说不会有因为编码而导致的问题啊,疑惑

白水饮 发表于 2022-9-7 09:53

cmd默认GBK编码
页: [1] 2
查看完整版本: python 初学进程的疑问