热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决subprocess.Popen在windows下执行命令报的KeyError:'PATH'问题

最近接到一个使用python写一个解析yaml文件,并根据内容配置指定对应的shell来执行(比如bat、powershell、bash、csh、zsh等)命令的功能,于是考虑使用

最近接到一个使用python写一个解析yaml文件,并根据内容配置指定对应的shell来执行(比如bat、powershell、bash、csh、zsh等)命令的功能,于是考虑使用subprocess.Popen模块来实现执行命令相关的功能,subprocess.Popen详细的参数这里不细述,自己在测试执行python命令查看输出显示如下错误信息

>>> pipe=subprocess.Popen(['python','-c',"import os;print(os.environ.get('test'))"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT,env={'test':'hello world'})
>>> print pipe.stdout.read()
hello world
Error processing line 5 of C:\Python27\lib\site-packages\pywin32.pth:
Traceback (most recent call last):
File "C:\Python27\lib\site.py", line 152, in addpackage
exec line
File "", line 1, in
File "C:\Python27\lib\os.py", line 425, in __getitem__
return self.data[key.upper()]
KeyError: 'PATH'
Remainder of file ignored

这时仔细查看subprocess.Popen详细env的参数说明

env参数:
如果env不是None,则子程序的环境变量由env的值来设置,而不是默认那样继承父进程的环境变量。注意,即使你只在env里定义了
某一个环境变量的值,也会阻止子程序得到其
他的父进程的环境变量(也就是说,如果env里只有1项,那么子进程的环境变量就只有1个了)

 发现是设置env环境变量的值之后则子程序不再继承父进程的环境变量了,这个时候打印子程序里面对应的环境变量可以发现只有env中指定的相关值了,咱们使用os.environ测试下

>>> pipe=subprocess.Popen(['python','-c',"import os;print os.environ"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT,env={'test':'hello world'})
>>> print pipe.stdout.read()
{'TEST': 'hello world'}
Error processing line 5 of C:\Python27\lib\site-packages\pywin32.pth:
Traceback (most recent call last):
File "C:\Python27\lib\site.py", line 152, in addpackage
exec line
File "", line 1, in
File "C:\Python27\lib\os.py", line 425, in __getitem__
return self.data[key.upper()]
KeyError: 'PATH'
Remainder of file ignored
>>>

可以发现对应的环境变量中只剩下{'TEST': 'hello world'}了,这时候因为没有继承父进程中的环境变量所以PATH变量也就不存在了,所以这时候就会报错,解决办法是设置env变量的将PATH变量一起加上就可以了,如果不加上PATH执行一些非shell内建命令时会提示“不是内部或外部命令,也不是可运行的程序 或批处理文件”,这是因为PATH不存在相应的命令也就搜索不到了加上就可以了

>>> pipe=subprocess.Popen(['python','-c',"import os;print(os.environ.get('test'))"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT,env={'test':'hello world','PATH':os.environ.setdefault('PATH')})
>>> print pipe.stdout.read()
hello world
>>>

 



推荐阅读
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
  • 本文探讨了如何将Python对象转换为字节流,以实现文件保存、数据库存储或网络传输的需求。主要介绍了利用pickle模块进行序列化的具体方法。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 每种编程语言都有其独特的完成任务的方式,这也说明了为什么有这么多语言可供选择。在JimHall的《不同的编程语言如何完成相同的事情》文章中,他演示了13种不同的语言如何使用不同的语 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • 在Spring Boot项目中,通过YAML配置文件为静态变量设置值的方法与实践涉及以下几个步骤:首先,创建一个新的配置类。需要注意的是,自动生成的setter方法默认是非静态的,因此需要手动将其修改为静态方法,以确保静态变量能够正确初始化。此外,建议使用`@Value`注解或`@ConfigurationProperties`注解来注入配置属性,以提高代码的可读性和维护性。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文将详细探讨 Python 编程语言中 sys.argv 的使用方法及其重要性。通过实际案例,我们将了解如何在命令行环境中传递参数给 Python 脚本,并分析这些参数是如何被处理和使用的。 ... [详细]
  • 本文详细介绍了在Mac平台上安装和配置MySQL的步骤,包括下载安装包、卸载MySQL以及解决命令行中找不到mysql命令的问题。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • Envoy 流量分配策略优化
    在本研究中,我们对Envoy的流量分配策略进行了优化,旨在提高系统的稳定性和性能。实验环境包括一个前端代理服务(Envoy,IP地址为172.31.57.10)和五个后端服务。通过调整Envoy的配置,实现了更高效的流量分发和负载均衡,显著提升了整体系统的响应速度和可靠性。 ... [详细]
author-avatar
dcl9784752
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有