python subprocess 路径错误解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python subprocess 路径错误解决相关的知识,希望对你有一定的参考价值。

参考技术A 使用Python的 pygifsicle 压缩GIF图片时收到错误

根据报错信息可以推断

分别查看函数,发现 call() 用于运行命令,上网查找关于 subprocess.py call函数 的相关信息。

发现:

参考: https://www.cnblogs.com/jqpy1994/p/10135924.html

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

最近接到一个使用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:Python27libsite-packagespywin32.pth:
  Traceback (most recent call last):
    File "C:Python27libsite.py", line 152, in addpackage
      exec line
    File "<string>", line 1, in <module>
    File "C:Python27libos.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:Python27libsite-packagespywin32.pth:
  Traceback (most recent call last):
    File "C:Python27libsite.py", line 152, in addpackage
      exec line
    File "<string>", line 1, in <module>
    File "C:Python27libos.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
>>> 

 

以上是关于python subprocess 路径错误解决的主要内容,如果未能解决你的问题,请参考以下文章

pygame使用pip安装时报错,求解决

python--subprocess,粘包现象与解决办法,缓冲区

成功解决pip:This error originates from a subprocess, and is likely not a problem with pip. 轩详细教程

Python 的 subprocess.Popen 是不是接受路径中的空格?

subprocess.call 路径问题,如何解决?

Python subprocess.Popen() error (No such file or directory)