Python调用外部程序——os.system()和subprocess.call

经过os.system函数调用其余程序

预备知识:cmd中打开和关闭程序

cmd中打开程序python

a.打开系统自带程序shell

系统自带的程序的路径通常都已加入环境变量之中,只需在cmd窗口中直接输入程序名称便可。ide

以notepad为例,直接在cmd窗口中输入notepad后回车便可打开。函数

b.打开本身安装且没有加入环境变量的程序ui

以网易云音乐为例,在cmd窗口中须要输入完整的程序路径 "D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe"。this

注意,双引号是必须的。spa

若将网易云音乐的路径加入环境变量之中,则在cmd窗口中输入cloudmusic后回车便可运行。code

在cmd中关闭程序orm

在cmd中关闭程序能够使用taskkill命令,语法以下:blog

taskkill /f /t /im 进程名

注意,这里只须要程序的进程名便可,而非完整路径名。

仍以网易云音乐为例,在cmd窗口中输入 taskkill /f /t /im cloudmusic.exe 后回车便可关闭网易云音乐。

以下图所示:

Python调用外部程序——os.system()和subprocess.call

a.os.system方法

Execute the command (a string) in a subshell. This is implemented by calling the Standard C function system, and has the same limitations. Changes tosys.stdin, etc. are not reflected in the environment of the executed command.

On Unix, the return value is the exit status of the process encoded in the format specified for wait. Note that POSIX does not specify the meaning of the return value of the Csystemfunction, so the return value of the Python function is system-dependent.

On Windows, the return value is that returned by the system shell after runningcommand, given by the Windows environment variableCOMSPEC: oncommand.comsystems (Windows 95, 98 and ME) this is always0; oncmd.exesystems (Windows NT, 2000 and XP) this is the exit status of the command run; on systems using a non-native shell, consult your shell documentation.

The subprocessmodule provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function. See theReplacing Older Functions with the subprocess Modulesection in thesubprocessdocumentation for some helpful recipes.

Availability: Unix, Windows.

os模块中的system函数能够方便地运行其余程序或者脚本。其函数原型为:

os.system(command)

command 为要执行的命令,近似于Windows下cmd窗口中输入的命令。

若是要向程序或者脚本传递参数,能够使用空格分隔程序及多个参数。

1 status = os.system("mycmd" + " myarg")2 # becomes3 status = subprocess.call("mycmd" + " myarg", shell=True)

Notes:

  • Calling the program through the shell is usually not required.

A more realistic example would look like this:

1 try:2 retcode = call("mycmd" + " myarg", shell=True)3 if retcode < 0:4 print >>sys.stderr, "Child was terminated by signal", -retcode5 else:6 print >>sys.stderr, "Child returned", retcode7 except OSError as e:8 print >>sys.stderr, "Execution failed:", e

实例演示:

打开记事本:

1 import os2 os.system('notepad')

1 import subprocess2 subprocess.call('notepad')

咱们看如下代码:

1 import os2 os.system(r'"D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe"')

这段代码会启动网易云音乐,效果和咱们在cmd窗口中输入 "D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe" 效果同样。注意字符串中含有空格,因此有 r''。

而如下代码也能够实现一样的功能:

1 import subprocess2 subprocess.call("D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe")

同上面那段代码的区别只是括号中的 r''。

到目前为止一切正常,咱们再看下面的代码,尝试着同时打开两个程序:

1 import os2 os.system(r'"D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe""notepad"')3 或4 os.system("D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe""notepad")5 或6 os.system(""D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe""notepad"")

以上尝试都不会成功。

换作subprocess.call函数也不能实现。

这个问题早在07年就有人提交过,请参考http://bugs.python.org/issue1524

os.system和subprocess.call的区别之后补充。

相关文章
相关标签/搜索