一般调用

我们使用subprocess.Popen进行如下的子进程调用:

import subprocess

cmd = ['ls']

process = subprocess.Popen(cmd, stdout=subprocess.PIPE)

for stdout_line in iter(process.stdout.readline, b''):

print(stdout_line)

process.stdout.close()

return_code = process.wait()

if return_code:

raise subprocess.CalledProcessError(return_code, cmd)

shell=True

但当在Windows平台下运行dir命令,报错:FileNotFoundError: [WinError 2] The system cannot find the file specified。

解决方法,添加shell=True参数。

原因是:dir不是单独的命令,其是CMD(Windows 的shell)的内置程序,所以加shell=True参数。

注意:仅在绝对必要时才应使用shell=True。

import subprocess

cmd = ['dir']

process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

for stdout_line in iter(process.stdout.readline, b''):

print(stdout_line)

实时读取子进程输出

有时,发现运行的子进程,上述代码不会即时打印输出,而是要等个几秒钟。

原因是:子进程所运行的程序没有对stdout进行flush,比如C语言的printf没有即时flush时,其打印的输出其实是在缓冲区中的,得等缓冲区满了才集体输出一次。

解决方法:子进程如何运行的是Python,比较简单,添加os.environ["PYTHONUNBUFFERED"] = "1"即可。

如果是在Linux平台运行一般程序,添加cmd = ["stdbuf", "-oL"] + cmd即可。

如何为子进程添加环境变量

通过env=参数。

注意:只传我们想添加的那个环境变量(比如LD_LIBRARY_PATH)是不行,子进程默认是使用很多父进程的环境变量,因此先copy父进程的环境变量,再添加我们需要的。

my_env = os.environ.copy()

my_env['LD_LIBRARY_PATH'] = '../libs/x64/'

cmd = ['command']

popen = subprocess.Popen(cmd,

stdout=subprocess.PIPE,

env=my_env)

子进程切换工作目录

有时,我们的子进程需要在特定的目录里运行。

解决:使用cwd=环境变量。

pwd = os.path.dirname(__file__)

cmd = ['command']

popen = subprocess.Popen(cmd,

stdout=subprocess.PIPE,

cwd=os.path.join(pwd, '..', 'bin'))

python执行cmd subprocess持续_Python subprocess 使用的几个小问题相关推荐

  1. python发送cmd命令_用Python 执行cmd命令

    我们通常可以使用os模块的命令进行执行cmd 方法一:os.system os.system(执行的命令) # 源码 def system(*args, **kwargs): # real signa ...

  2. windows python 执行cmd 命令启动浏览器跳转到指定网页

    windows python 执行cmd 命令启动浏览器跳转到指定网页 1.系统默认浏览器打开百度 cmd命令 # 有没有http都是可以的 start www.baidu.com python im ...

  3. python执行cmd subprocess持续_如何通过 subprocess 持续获取输出内容

    这里将告诉您如何通过 subprocess 持续获取输出内容,教程操作步骤: 在实际应用中会用到subprocess的Popen方法执行一些命令,而我们需要通过执行这个命令的来获取输出进行一些信息记录 ...

  4. python执行系统命令的方法_python执行系统命令的方法 :os.system(),subprocess.popen(),command...

    最近接触到os.system(),subprocess.popen()和commands来执行系统命令,从网上搜索到许多,现整理如下. 1. 使用os.system("cmd") ...

  5. python执行系统命令的方法:subprocess

    适用于Python3 subprocess 可以执行shell命令的相关模块和函数有: os.system os.spawn os.popen –废弃 popen2.* –废弃 commands.* ...

  6. python subprocess使用_Python subprocess模块用法详解

    在 Python 2.7 及 Python 3 中,系统自带了 subprocess 模块,该模块主要用来管理子进程. 在使用该模块之前需要将其引入,方法如下: import subprocess 在 ...

  7. python shell 继承 环境变量_Python subprocess shell 丢失环境变量 | 学步园

    问题: 今天遇到一个问题,我用一个python module通过subprocess以shell的方式调用另一个python module,结果导致丢失环境变量. 事实上,无论是python还是jav ...

  8. python subprocess模块_python subprocess模块详解

    一.subprocess标准库 python执行shell脚本,通常会使用so模块中的几个方法,如system.spawn*.popen等.subprocess标准库的引入就是为了取代这些老的模块方法 ...

  9. python执行cmd并返回是否成功_python脚本执行CMD命令并返回结果的例子

    最近写脚本的时想要用python直接在脚本中去执行cmd命令,并且将返回值打印出来供下面调用,所以特意查了下,发现主要有一下几种方式来实现,很简单: 就拿执行adb, adb shell, adb d ...

最新文章

  1. 【网络流】解题报告:luogu P2740 [USACO4.2]草地排水Drainage Ditches(Edmonds-Karp增广路,最大流模板)
  2. sql%notfound与exception
  3. 一致性Hash算法(KetamaHash)的c#实现
  4. HALCON测量工具
  5. Java 动作事件_java按钮动作事件
  6. 深度解读 MongoDB 4.4 新特性
  7. 16位的数字高字节和低字节_显示掩盖较低和较高的16位数字半字节| 8086微处理器...
  8. 判断点是否在三角形内
  9. 快手大数据架构演进实录
  10. 以太坊开发入门,完整入门篇
  11. Linux系统管理---RAID磁盘阵列
  12. Android 关于 ActionBarSherlock 的使用
  13. 获取微信运动 php,微信运动数据抓取(PHP语言)
  14. 编程的修炼(中英双语)
  15. LEADTOOLS V20,史无前例荣耀归来!!!
  16. 云分享YFX软件合集-开车不是儿戏!这些坏习惯,时时刻刻威胁着你的生命安全
  17. 还有哪些不错的正规Java培训机构
  18. poj1008 -- 玛雅历
  19. 补数的概念和取模运算
  20. win7系统语言栏默认输入法怎么设置教学分享

热门文章

  1. 小球自由落体后反弹,计算路线和反弹高度
  2. 试验10:RIP试验1
  3. 使用Fetch请求,如何下载二进制流格式的文件
  4. 【干货|知识分享】Solidworks与Rhino有什么区别呢?
  5. 大白NBIOT 移远BC26模块模组OpenCpu开发视频教程(有连接移动、电信平台的opencpu源码)
  6. web浏览器使用ic卡或磁卡读卡器自动弹出页面
  7. Python基础之运算符大汇总
  8. github 开源项目如何推广
  9. Windows下使用Nginx
  10. 计算机学院类脑计算,类脑计算丨CNCC技术论坛