Python调用外部程序问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python调用外部程序问题?相关的知识,希望对你有一定的参考价值。

实现的功能举例,foxit reader的路径是"D:/Program Files/Foxit Software/Foxit reader.exe"。当前脚步所在文件夹(或者路径中)有一个"abc.pdf"。要求使用foxit reader打开这个pdf文件。估计可以两三行搞定,多谢!

为什么是/而不是\?
\才是windows下的路径分割符合啊!

借用楼上的
import os
os.system(r'"D:\Program Files\Foxit Software\Foxit reader.exe" abc.pdf')
偶想""是不可缺少的,因为路径中有空格,否则极容易出错;对-参数不了解,不发表意见

使用os.system会有几个问题:
1、os.system会阻塞程序继续运行(如果是图形界面,还会把图形界面搞的没反应),当然如果需要阻塞,自然不是问题。
2、os.system会打开一个命令行窗口,这是比较讨厌的;除非你确实需要显示这个命令行窗口或者本来就是命令行里运行的。

所以还是建议使用 os.popen,基本语法是一样的

import os
os.popen(r'"D:\Program Files\Foxit Software\Foxit reader.exe" abc.pdf')

这样不会出现命令行窗口,不会阻塞程序运行
如果需要阻塞程序运行,可以这样写:
os.popen(r'"D:\Program Files\Foxit Software\Foxit reader.exe" abc.pdf').read()
参考技术A import os
os.system('D:/Program Files/Foxit Software/Foxit reader.exe abc.pdf -n 1 --Register')

其中 -n 后面的参数是打开第几页,不一定是1

Python调用外部程序

通过os.system和subprocess.call()函数调用其他程序

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

cmd中打开程序

a.打开系统自带程序

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

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

b.打开自己安装且没有加入环境变量的程序

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

    注意,双引号是必须的。

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

在cmd中关闭程序

    在cmd中关闭程序可以使用taskkill命令,语法如下:

    taskkill /f /t /im 进程名

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

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

    如下图所示:

技术分享

a.os.system方法

os.system(command)  链接 https://docs.python.org/2/library/os.html#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 to sys.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 C system() function, so the return value of the Python function is system-dependent.

On Windows, the return value is that returned by the system shell after running command, given by the Windows environment variableCOMSPEC: on command.com systems (Windows 95, 98 and ME) this is always 0; on cmd.exe systems (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 subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function. See the Replacing Older Functions with the subprocess Module section in the subprocessdocumentation for some helpful recipes.

Availability: Unix, Windows.

os模块中的system()函数可以方便地运行其他程序或者脚本。其函数原型为:
os.system(command)
command 为要执行的命令,近似于Windows下cmd窗口中输入的命令。

如果要向程序或者脚本传递参数,可以使用空格分隔程序及多个参数。

b.用subprocess.call()代替os.system()

17.1.4.3. Replacing os.system()    

链接 https://docs.python.org/2/library/subprocess.html#replacing-os-system

1 status = os.system("mycmd" + " myarg")
2 # becomes
3 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", -retcode
5     else:
6         print >>sys.stderr, "Child returned", retcode
7 except OSError as e:
8     print >>sys.stderr, "Execution failed:", e
技术分享

 实例演示:

打开记事本:

1 import os
2 os.system(‘notepad‘)

1 import subprocess
2 subprocess.call(‘notepad‘)

我们看以下代码:

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

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

而以下代码也可以实现同样的功能:

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

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

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

1 import os
2 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()的区别以后补充。

 










以上是关于Python调用外部程序问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中调用外部程序并检索输出和返回代码?

Python - 如何调用外部 Python 程序?

Python调用外部程序

Python调用(运行)外部程序

C#winform 关于调用外部程序的问题

QT调用外部程序