[转载]Python模块学习 ---- subprocess 创建子进程

 

[转自]http://blog.sciencenet.cn/blog-600900-499638.html

 

最近,我们老大要我写一个守护者程序,对服务器进程进行守护。如果服务器不幸挂掉了,守护者能即时的重启应用程序。上网Google了一下,发现Python有很几个模块都可以创建进程。最终我选择使用subprocess模块,因为在Python手册中有这样一段话:

  This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.*

  subprocess被用来替换一些老的模块和函数,如:os.system、os.spawn*、os.popen*、popen2.*、commands.*。可见,subprocess是被推荐使用的模块。

 

下面是一个很简单的例子,创建一个新进程,执行app1.exe,传入相当的参数,并打印出进程的返回值:

 

 
  1. import subprocess  
  2.   
  3. returnCode = subprocess.call('app1.exe -a -b -c -d')  
  4. print 'returncode:', returnCode  
  5.   
  6. #----- 结果 --------   
  7. #Python is powerful   
  8. #app1.exe   
  9. #-a   
  10. #-b   
  11. #-c   
  12. #-d   
  13. returncode: 0  

import subprocess returnCode = subprocess.call('app1.exe -a -b -c -d') print 'returncode:', returnCode #----- 结果 -------- #Python is powerful #app1.exe #-a #-b #-c #-d returncode: 0

 

app1.exe是一个非常简单的控制台程序,它只打印出传入的参数,代码如下:

 

 
  1. #include <iostream>   
  2. using namespace std;  
  3.   
  4. int main(int argc, const char *argv[])  
  5. {  
  6.     cout << "Python is powerful" << endl;  
  7.     for (int i = 0; i < argc; i++)  
  8.     {  
  9.         cout << argv[i] << endl;  
  10.     }  
  11.   
  12.     return 0;  
  13. }  

#include <iostream> using namespace std; int main(int argc, const char *argv[]) { cout << "Python is powerful" << endl; for (int i = 0; i < argc; i++) { cout << argv[i] << endl; } return 0; }

 

  闲话少说,下面开始详细介绍subprocess模块。subprocess模块中只定义了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下:

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

  参数args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。我们也可以显式的使用executeable参数来指定可执行文件的路径。在windows操作系统上,Popen通过调用 CreateProcess()来创建子进程,CreateProcess接收一个字符串参数,如果args是序列类型,系统将会通过 list2cmdline()函数将序列类型转换为字符串。
  参数bufsize:指定缓冲。我到现在还不清楚这个参数的具体含义,望各个大牛指点。
  参数executable用于指定可执行程序。一般情况下我们通过args参数来设置所要运行的程序。如果将参数shell设为True,executable将指定程序使用的shell。在windows平台下,默认的shell由COMSPEC环境变量来指定。
  参数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。
  参数preexec_fn只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用。
  参数Close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。我们不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
  如果参数shell设为true,程序将通过shell来执行。
  参数cwd用于设置子进程的当前目录。
  参数env是字典类型,用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
  参数Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下用'/r/n'表示换,而Linux下用'/n'。如果将此参数设置为True,Python统一把这些换行符当作'/n'来处理。
  参数startupinfo与createionflags只在windows下用效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。 

subprocess.PIPE

  在创建Popen对象时,subprocess.PIPE可以初始化stdin, stdout或stderr参数。表示与子进程通信的标准流。

subprocess.STDOUT

  创建Popen对象时,用于初始化stderr参数,表示将错误通过标准输出流输出。 

 

Popen的方法:

Popen.poll() 

  用于检查子进程是否已经结束。设置并返回returncode属性。

Popen.wait() 

  等待子进程结束。设置并返回returncode属性。

Popen.communicate(input=None)

  与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须被设置为PIPE。同样,如果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。

Popen.send_signal(signal) 

  向子进程发送信号。

Popen.terminate()

  停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。

Popen.kill()

  杀死子进程。

Popen.stdin 

  如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。

Popen.stdout 

  如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回None。

Popen.stderr 

  如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回None。

Popen.pid 

  获取子进程的进程ID。

Popen.returncode 

  获取进程的返回值。如果进程还没有结束,返回None。

 下面是一个非常简单的例子,来演示supprocess模块如何与一个控件台应用程序进行交互。

 

 
  1. import subprocess  
  2.   
  3. p = subprocess.Popen("app2.exe", stdin = subprocess.PIPE, /  
  4.     stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)  
  5.   
  6. p.stdin.write('3/n')  
  7. p.stdin.write('4/n')  
  8. print p.stdout.read()  
  9.   
  10. #---- 结果 ----   
  11. input x:   
  12. input y:   
  13. 3 + 4 = 7  

import subprocess p = subprocess.Popen("app2.exe", stdin = subprocess.PIPE, / stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False) p.stdin.write('3/n') p.stdin.write('4/n') print p.stdout.read() #---- 结果 ---- input x: input y: 3 + 4 = 7

 

app2.exe也是一个非常简单的控制台程序,它从界面上接收两个数值,执行加操作,并将结果打印到控制台上。代码如下:

 

 
  1. #include <iostream>   
  2. using namespace std;  
  3.   
  4. int main(int argc, const char *artv[])  
  5. {  
  6.     int x, y;  
  7.     cout << "input x: " << endl;  
  8.     cin >> x;  
  9.     cout << "input y: " << endl;  
  10.     cin >> y;  
  11.     cout << x << " + " << y << " = " << x + y << endl;  
  12.   
  13.     return 0;  
  14. }  

#include <iostream> using namespace std; int main(int argc, const char *artv[]) { int x, y; cout << "input x: " << endl; cin >> x; cout << "input y: " << endl; cin >> y; cout << x << " + " << y << " = " << x + y << endl; return 0; }

 

 

  supprocess模块提供了一些函数,方便我们用于创建进程。

subprocess.call(*popenargs, **kwargs)

  运行命令。该函数将一直等待到子进程运行结束,并返回进程的returncode。文章一开始的例子就演示了call函数。如果子进程不需要进行交互,就可以使用该函数来创建。

subprocess.check_call(*popenargs, **kwargs) 

  与subprocess.call(*popenargs, **kwargs)功能一样,只是如果子进程返回的returncode不为0的话,将触发CalledProcessError异常。在异常对象中,包括进程的returncode信息。

 

  subprocess模块的内容就这么多。在Python手册中,还介绍了如何使用subprocess来替换一些老的模块,老的函数的例子。赶兴趣的朋友可以看一下。

 

 

 

在熟悉了Qt的QProcess以后,再回头来看python的subprocess总算不觉得像以前那么恐怖了。

和QProcess一样,subprocess的目标是启动一个新的进程并与之进行通讯。

subprocess.Popen

这个模块主要就提供一个类Popen:

class subprocess.Popen( args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

这堆东西真让人抓狂:

args

字符串或者列表

bufsize

0 无缓冲
1 行缓冲
其他正值 缓冲区大小
负值 采用默认系统缓冲(一般是全缓冲)

executable

一般不用吧,args字符串或列表第一项表示程序名

stdin
stdout
stderr

None 没有任何重定向,继承父进程
PIPE 创建管道
文件对象
文件描述符(整数)
stderr 还可以设置为 STDOUT

preexec_fn

钩子函数, 在fork和exec之间执行。(unix)

close_fds

unix 下执行新进程前是否关闭0/1/2之外的文件
windows下不继承还是继承父进程的文件描述符

shell

为真的话
unix下相当于args前面添加了 "/bin/sh“ ”-c”
window下,相当于添加"cmd.exe /c"

cwd

设置工作目录

env

设置环境变量

universal_newlines

各种换行符统一处理成 '\n'

startupinfo

window下传递给CreateProcess的结构体

creationflags

windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口

  • 当初最感到困扰的就是 args 参数。可以是一个字符串,可以是一个列表。

 

subprocess.Popen(["gedit","abc.txt"]) subprocess.Popen("gedit abc.txt")

这两个之中,后者将不会工作。因为如果是一个字符串的话,必须是程序的路径才可以。(考虑unix的api函数 exec,接受的是字符串列表)

  • 但是下面的可以工作

 

subprocess.Popen("gedit abc.txt", shell=True)

这是因为它相当于

subprocess.Popen(["/bin/sh", "-c", "gedit abc.txt"])

都成了sh的参数,就无所谓了

  • 在Windows下,下面的却又是可以工作的

 

subprocess.Popen(["notepad.exe", "abc.txt"]) subprocess.Popen("notepad.exe abc.txt")

这是由于windows下的api函数CreateProcess接受的是一个字符串。即使是列表形式的参数,也需要先合并成字符串再传递给api函数。

  • 类似上面

 

subprocess.Popen("notepad.exe abc.txt" shell=True)

等价于

subprocess.Popen("cmd.exe /C "+"notepad.exe abc.txt" shell=True) subprocess.call*

模块还提供了几个便利函数(这本身也算是很好的Popen的使用例子了)

  • call() 执行程序,并等待它完成

 

def call(*popenargs, **kwargs): return Popen(*popenargs, **kwargs).wait()
  • check_call() 调用前面的call,如果返回值非零,则抛出异常

 

def check_call(*popenargs, **kwargs): retcode = call(*popenargs, **kwargs) if retcode: cmd = kwargs.get("args") raise CalledProcessError(retcode, cmd) return 0
  • check_output() 执行程序,并返回其标准输出

 

def check_output(*popenargs, **kwargs): process = Popen(*popenargs, stdout=PIPE, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") raise CalledProcessError(retcode, cmd, output=output) return output Popen对象

该对象提供有不少方法函数可用。而且前面已经用到了wait()/poll()/communicate()

poll()

检查是否结束,设置返回值

wait()

等待结束,设置返回值

communicate()

参数是标准输入,返回标准输出和标准出错

send_signal()

发送信号 (主要在unix下有用)

terminate()

终止进程,unix对应的SIGTERM信号,windows下调用api函数TerminateProcess()

kill()

杀死进程(unix对应SIGKILL信号),windows下同上

stdin
stdout
stderr

参数中指定PIPE时,有用

pid

进程id

returncode

进程返回值

参考
Python vs BAT: 用Python来实现批处理

开始将原先的Windows批处理脚本适当的转为Python,好处是自然的,Python的脚本比Windows脚本好维护的多,不过转换不是那么简单直白,一一记录一些心得:

命令行参数

Windows批处理的参数,通常就是通过命令行或者环境变量传给bat,前者就是bat中常见的%1,%2,shift这些东西,在python中可以用OptionParser来实现,OptionParser是我用过最方便的命令行参数解析模块了,可以参考网友总结的中文说明,或者参考一下代码,基本也就清楚如何使用了:

try: from optparse import OptionParser except ImportError: try: from optik import OptionParser except ImportError: raise ImportError, 'Requires Python 2.3 or the Optik option parsing library.'   parser = OptionParser(usage=u"这个脚本用于测试") parser.add_option('-p', '--project', dest='project',default=os.path.normpath(os.path.join(os.getcwd(), '../..')), help=u'设置项目目录,缺省为:当前目录的上两级目录') parser.add_option("-s", '--dosvn', action="store_true", dest="dosvn", help=u'设置是否检测svn,缺省为不检测') parser.add_option('-w', '--waittimeout', dest='waittimeout',type="int", default=300, help=u'设置启动时的等待超时,缺省为300秒')   (options, args) = parser.parse_args(sys.argv[1:])

如果是环境变量,bat中用%environ%的形式,python中则可以用 os.environ.get(”prompt”),这个对应比较直白自然。

其实Windows还支持一些很奇怪的变量(官方叫做Modifier),像是%~dp0,这个是表示当前批处理文件所在目录,这是因为Windows的批处理是在功能有限,也不支持函数,对于一些很常用的操作没办法,只能用这些密码一样的符号来实现了。

启动进程

批处理中最方便的功能就是顺序启动一个个进程了,当然也包括cmd自己的内部命令(比如dir什么的)或者call其他的批处理文件,这些在python中统一归subprocess这个模块来做,官方的文档已近给出用subprocess替代原先的诸如os.system,os.spawn,os.popen之类调用的方法,因为subprocess足够的灵活和强大。比如在bat中想捕获一个子进程的输出到一个变量中,得使用这样的难懂的语法,我前面的帖子中曾经给出过一个这样的例子:

for /F %%A in ('svnlook author -r %REV% %1') do @set AUTHOR=%%A

在Python的subprocess下,就比较简单了:

process = subprocess.Popen(target, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) (stdoutput,erroutput) = process.communicate() return stdoutput

获取进程返回

批处理中常常通过ERRORLEVEL来判断进程的返回值,来决定下一步的执行,这在python没有问题,用Popen建立的子进程有一个wait方法会等待子进程执行完毕,并返回子进程的return code。

不过对于调用一个bat的情况,则需要通过call来调用,才能得到它的和ERRORLEVEL一样效果的返回值,这点在文档中没有提及,却是非常重要的,下面的函数算是一个例子(绝大部分情况下,使用useCall和useShell都没错):

def run(self, target, useCall=True, useShell=True, cwd=None): if useCall: target = "call " + target process = subprocess.Popen(target, shell=useShell, cwd=cwd) process.wait() return process.returncode

重定向

这是一个从bat转到python的难点,Windows基本上支持了和Unix类似的stdin、stdout、stderr以及管道等机制,这些在bat中可以和容易的调用,可以在写批处理时比较容易的灵活运用,而在python下要实现还是比较复杂的,不过其实理解以后也不会太难,主要是通过 subprocess和python自己的文件处理功能相结合,下面是一个较复杂的例子,说明怎么通过tee.exe来实现子进程的的标准输出、标准错误输出同时定向到屏幕和文件:

self.tee = subprocess.Popen(["tee", LOG_FILE], stdin=subprocess.PIPE) process = subprocess.Popen(target, shell=True, stdout=self.tee.stdin.fileno(), stderr=subprocess.STDOUT)

tee是来自unixutils的工具,广泛用来解决标准输入同时到标准输出和文件的一个小工具,不知道不用tee的话python怎么简单的解决这个问题,不过用tee的话上面的代码倒是很直接明了。

其他

还有什么批处理转到Python需要注意的,好像没有太多了,基本上,这种转换,一次受累,长时间受益。

 

subprocess再解析

之前已经写过一篇关于Python subprocess的帖子了,subprocess是Python下标准的用于进程创建、通讯的模块,这里再补充一些,注意:我还一直坚守Python2.x,所以不一定适合Python 3。

subprocess简单用法

这是最简单的用法:

p=subprocess.Popen("dir", shell=True) p.wait()

shell参数根据你要执行的命令的情况来决定,上面是dir命令,就一定要shell=True了,p.wait()可以得到命令的返回值,没有问题。

进程通讯

如果想得到进程的输出,管道是个很方便的方法,这样:

p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdoutput,erroutput) = p.communicate()

p.communicate会一直等到进程退出,并将标准输出和标准错误输出返回,这样就可以得到子进程的输出了,上面,标准输出和标准错误输出是分开的,也可以合并起来,只需要将stderr参数设置为subprocess.STDOUT就可以了,这样子:

p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) (stdoutput,erroutput) = p.communicate()

如果你想一行行处理子进程的输出,也没有问题:

p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while True: buff = p.stdout.readline() if buff == '' and p.poll() != None: break
死锁

但是如果你使用了管道,而又不去处理管道的输出,那么小心点,如果子进程输出数据过多,死锁就会发生了,比如下面的用法:

p=subprocess.Popen("longprint", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) p.wait()

longprint是一个假想的有大量输出的进程,那么在我的xp, Python2.5的环境下,当输出达到4096时,死锁就发生了。当然,如果我们用p.stdout.readline或者p.communicate 去清理输出,那么无论输出多少,死锁都是不会发生的。或者我们不使用管道,比如不做重定向,或者重定向到文件,也都是可以避免死锁的。

异步subprocess

无论是使用readline还是communicate,这里有个问题是:他们都是同步的,你没有办法在等待子进程输出的同时做点别的什么事情,标准的subprocess是不支持异步和子进程交互的,幸好,幸好,有人提供了Python 3下的异步方法,我移植到Python2.5下面,可以这样用了:

p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while True: buff = p.asyncread(timeout=0.5) if buff == '' and p.poll() != None: break

这里带一个超时去读取子进程的输出,如果超时还没有输出,没关系,父进程可以干点别的什么事情,看起来很棒,subprocess的改动部分代码比较长,不在这里贴了。

关闭
在Python 2.6的subprocess模块中,新增加了一个小的接口就是Terminate,用于进程的终结,可惜可惜,十分遗憾,Windows下,这个 Terminate只能杀死subprocess创建的进程,而不能杀死其子进程,如果我们明确知道创建的进程没有子进程,当然可以用这个接口,如果不肯定,则这个接口就没什么用了。

举个简单的例子,如果用shell=True的参数让subprocess创建进程,那么就会多出一个额外的cmd进程,这时用Terminate终结的就是这个cmd进程,而真正那个我们创建的进程则不会被终结。

有很多方法可以对付这个问题,但有一个简单的方法是使用Windows自己提供的taskkill命令,它有一个/T参数,可以杀死一个进程树,正是我们所需要的。subprocess创建的进程有一个pid属性,把pid传给taskkill就ok了

转载于:https://www.cnblogs.com/rosepotato/p/3556408.html

python使用subprocess操作子进程 1.简介 subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。 2.run方法 run方法直接运行命令,然后返回一个CompletedProcess对象 subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, . 阅读详情

相关推荐

ControlCAN.dll开发适配USBCAN_E/2E_U设备

摘要:本文提供了USBCAN_E/2E_U设备的配置指南:1)安装专用驱动;2)获取最新的ControlCAN.dll文件;3)修改VCI调用顺序,新增VCI_SetReference函数设置波特率;4)使用工具计算波特率配置值,并给出了常见波特率对应的代码参考值(如500K对应0x060007)。配置过程强调使用特定工具计算精确的波特率参数,并提供了相关软件下载链接。

weixin_43969033的博客 390

WinAPI函数CreateProcess 关于创建无名管道通讯的不完美的实现

问题是什么? 由于工作原因,需要移植一个基于WINDOWS IOCP模型的程序到LINUX去.由于在LINUX是没有完成端口的东西,那么这一点上面LINUX提供了我们一个叫EPOLL的网络模型.解决完这个问题,基本上我想程序应该不会有太大的移植问题了.但是当我看到ServiceManager管理器程序大篇大篇的使用WINDOWS API函数的时候,我当时简直有点失去信息了.统计出来一共30个WI

cd_guoguo的专栏 2429

一文读懂GAN, pix2pix, CycleGAN和pix2pixHD

本文翻译、总结自朱俊伟的线上报告,主要讲了如何用机器学习生成图片。 来源:Games2018 Webinar 64期 :Siggraph 2018优秀博士论文报告 人员信息 主讲嘉宾 姓名:朱俊彦(Jun-Yan Zhu) 现状:麻省理工学院博士后(PostDoc at MIT),计算机科学与人工智能实验室(Computer Science and Artificial In...

gdymind的博客 6万+

用python3 中的subprocess写一个简单的守护进程

目录1. 简单介绍1.1. psutil1.2. subprocess1.2.1. subprocess.run()subprocess.CompletedProcess可能会用到的一些值1.2.3. subprocess.Popen4. 代码实例5. 参考文献 1. 简单介绍 通过使用python中的psutil库和subprocess库,实现了一个守护进程。 1.1. psutil 1.2. ...

besmarterbestronger的博客 3110

华为S5700三层交换机VLAN配置避坑指南:为什么你的VLAN间无法互通?

本文针对华为S5700三层交换机VLAN间无法互通的典型故障,提供深度排障指南。文章从数据转发原理入手,系统梳理了从物理链路、VLAN配置、VLANIF接口状态、路由表到ARP表、MTU及安全策略等全链路检查点,并给出了清晰的排查命令与流程,帮助网络工程师快速定位并解决VLAN间路由问题,实现稳定互通。

tt34567的博客 873

从3dB定向耦合器到双圆极化天线:在HFSS里玩转相位差90°的馈电艺术

本文详细介绍了在HFSS中设计3dB定向耦合器与双圆极化天线的关键技术,重点解析了90°相位差生成原理及馈电网络设计。通过HFSS仿真工具,实现从定向耦合器到完整天线系统的集成,优化阵列天线性能,适用于卫星通信和雷达系统。

weixin_33717117的博客 556

python 守护进程deamon

#!/usr/bin/env python # -*- coding:utf-8 -*- import sys import os import time import atexit from signal import SIGTERM class Daemon: """ A generic daemon class. Usage: subclass the Dae

redis的专栏 806

WRF中使用ERA5再分析数据

   本人在做一些实例时,需要用到最新的ERA5再分析数据集,其中我下载的是ERA5 hourly data on pressure levels form 1979 to present和ERA5 hourly data on single levels from 1979 to present中的3天数据。 1、注册climate copernicus账号 下载ERA5数据前先要注册其账号 2、选择变量    WRF中对于气象数据的字段有具体的要求, ......

GIS 8171

python中的subprocess.Popen()使用

转载自:https://www.cnblogs.com/zhoug2020/p/5079407.html 从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值。 subprocess意在替代其他几个老的模块或者函数,比如:os.system os.spawn* os.popen* popen2.* comm...

一直在路上的羊的博客 10万+

3DGS实战笔记:从相机坐标系到屏幕像素,手把手推导高斯椭球的投影变换矩阵

本文详细解析了3D高斯散射(3DGS)技术中从相机坐标系到屏幕像素的几何变换过程,重点推导了高斯椭球的投影变换矩阵。通过视图变换、投影变换和视口变换的完整流程,结合雅可比矩阵处理协方差矩阵,实现了高效的三维重建与渲染。文章提供了Python代码示例,帮助开发者深入理解3DGS的核心几何变换机制。

weixin_28691741的博客 438

海思芯片YOLOv8模型部署完整指南:从RPN硬化到8bit量化精度优化

本文详细介绍了在海思芯片平台部署YOLOv8目标检测模型的完整方案,重点解决8bit量化精度损失问题。通过分析海思RPN硬化层的性能优势(1.9ms推理时间),对比不同量化策略(16bit仅损失0.6AP,8bit损失5.2AP),并深入定位到strides计算层是量化误差的主要来源。关键突破在于采用混合精度策略(敏感层16bit,其余8bit),使8bit量化AP回升4.1%,同时保持3.4ms的推理速度和60%的低NPU占用率。文章还提供了量化参数调整、校准数据集优化等进阶技巧,为边缘计算应用提供了性能

FJN110的博客 732

Python2.7 subprocess模块学习

为什么80%的码农都做不了架构师?>>> ...

weixin_33912246的博客 1746

基于Simulink雷达系统建模仿真(附源码)

此示例显示如何设置由发射器、带目标的信道和接收器组成的雷达系统仿真。一、系统架构该系统包括:雷达脉冲发生器,以 2% 占空比(导通时间 = 2 ms,周期 = 100 ms)输出功率为 1 mW 的啁啾声。RF发射器部分由滤波器和组成,使用RF模块集电路包络库模块实现。由于滤波器是线性器件,放大器是非线性器件,因此它们被分成两个独立的子系统。这种分离允许在每个子系统中使用不同的仿真频率集。这种分离还允许在更快的仿真速度和级联链中可用的级间负载效应损失之间进行权衡。

珞瑜的博客 4583

Python:从subprocess运行的子进程中实时获取输出

有些时候,我们需要将某些程序放到子进程中去运行,以达到整合系统的目的。在Python中,一个非常好的选择就是使用subprocess模块,本模块为开辟子进程去执行子程序提供了统一的接口,更加便于学习和使用。 同时,对于在子进程里的程序,我们希望能够实时获取其输出,以在主进程中打印相关信息,使我们能够了解当前子程序的执行进度。对此,subprocess模块也提供了相应的参数,能够将子程序的标准输出和标准错误输出返回给主程序。 下面,我们就通过一个例子来说明这个功能。首先,我们需要一个用于模拟标准输出和标准

auspark的专栏 2151

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python subprocess模块 监控子进程的2种方式 忙等待和立即返回同时设置子进程超时...

下面的资料是关于python subprocess模块 监控子进程的2种方式 忙等待和立即返回同时设置子进程超时时间的代码。 import subprocess import os import time tt = '555' cmd = "python /home/100003/python/mypython/sub2.py "+" 333"+" 444 "+tt print...

weixin_34115824的博客 567

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python基础知识~ subprocess模块

一 定义 subprocess是python创建子进程的工具,其实和c中的fork出一个子进程,然后在子进程中运行exec执行另外一个进程很类似。 python关于执行linux的模块有很多,但是3.X以后都推荐统一用subprocess二 函数(我们这里只说最常用的) 1 p = subprocess.Popen(cmd, shell=True, stdou...

weixin_33924312的博客 273

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python subprocess模块

subprocess模块 subprocess模块用于创建和管理子进程,subprocess提供了Popen类来启动和设置子进程的参数,由于这个类比较复杂,还提供了便利函数。 subprocess便利函数, 包括call、check_call和check_output call() call运行由参数指定的命令知道命令结束,返回值是命令的退出状态码 >&...

anfen1088的博客 233

python子进程模块:subprocess

转载原文出处:http://mushanblog.com/blog/python-subprocess-module-primer 自己又结合源码和说明文档 有时候我们想做python脚本里调用其他程序怎么做?或者想获得某个shell命令返回的结果怎么做?答案是subprocess。 subprocess模块用来建立子进程,并且可以控制子进程的stdout,stdout,stde

RangeBlog 770

Python常用模块之五 subprocess

  Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system、os.spawn*、os.popen*、popen2.*、commands.*不但可以调用外部的命令作为子进程,而且可以连接到子进程的input/output/error管道,获取相关的返回信息。   subprocess模块中只定义了一个类: Popen。可以使用Popen来创建...

ak77142146的博客 152

Python标准库06 子进程 (subprocess包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 谢谢Tolbkni Kao帮我纠正错误 这里的内容以Linux进程基础和Li

wangchaoqi1985的博客 139

subprocess 子进程模块

subprocess子进程模块 import subprocess #Popen方法是用来执行系统命令的,直接把结果打印到终端了 res =subprocess.Popen(r'dir',shell=True, #r'dsfsdfr',shell=True, # stdin= #标准输入(...

weixin_34148456的博客 106

python中的subprocess库_Python标准库06 子进程 (subprocess包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!这里的内容以Linux进程基础执行外部的命令和程序。比如说,我需要使用wget下载文件。我在Python中调用wget程序。从这个意义上来说,subprocess的功能与shell类似。subprocess以及常用的封装函数当我们运行python的时候,我们都是在创建并运行一个进程。...

weixin_42513387的博客 193

python subprocess获取stdout和stderr

本文转载自http://www.firefoxbug.com/index.php/archives/2419/,如有版权问题请联系博主删除 用subprocess的时候,怎么获取stdout和stderr?下面是一种方式 import subprocess p = subprocess.Popen(['tail','-10','/tmp/hosts.txt'],stdin=subprocess.P...

码农的荒岛求生 1万+

Python之Subprocess模块

前言其实有一个模块也支持执行系统命令,那个模块就是sys.system,但他执行系统命令会直接通过主进程去执行命令,那假如,该命令的执行需要耗费一个小时,那么主进程会卡一个小时,而不会去干别的事,这样就会导致程序的运行效率低下。 如果由subprocess去执行系统命令的时候并不会让主进程去执行,而是主进程会开辟出一个子进程去执行,并不会影响到主进程的运行,主进程该干嘛就干嘛,那么又有个问题,大家...

weixin_33935777的博客 252
上一篇: 九度OJ 1533 最长上升子序列 -- 动态规划
下一篇: MonthPicker
weixin_30756499
博客等级 码龄11年 149粉丝 1414原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值