Python调用(运行)外部程序参数问题

ShellExecute 与 CreateProcess

ShellExecute

ShellExecute(hwnd, op , file , params , dir , bShow )
其参数含义如下所示。
hwnd:父窗口的句柄,如果没有父窗口,则为0。
op:要进行的操作,为“open”、“print”或者为空。
file:要运行的程序,或者打开的脚本。
params:要向程序传递的参数,如果打开的为文件,则为空。
dir:程序初始化的目录。
bShow:是否显示窗口
可以这么理解,使用ShellExecute就像在windows下的cmd中调用某个exe文件

CreateProcess

为了便于控制通过脚本运行的程序,可以使用win32process模块中的CreateProcess()函数。其函数原型如下所示。
CreateProcess(appName, commandLine , processAttributes , threadAttributes , bInheritHandles ,dwCreationFlags , newEnvironment , currentDirectory , startupinfo )
其参数含义如下。
appName:可执行的文件名。
commandLine:命令行参数。
processAttributes:进程安全属性,如果为None,则为默认的安全属性。
threadAttributes:线程安全属性,如果为None,则为默认的安全属性。
bInheritHandles:继承标志。
dwCreationFlags:创建标志。
newEnvironment:创建进程的环境变量。
currentDirectory:进程的当前目录。
startupinfo :创建进程的属性。
CreateProcess调用exe与ShellExecute调用略有不同,主要是参数的传递不同。接下来以例子说明

Example

编写一段简单的C++代码,并生成exe文件,代码如下

#include 
#include 

using namespace std;

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        cerr << "hello nothing" << endl;
        cin.get();
        return -1;
    }

    for (int i = 1; i < argc; ++i)
    {
        cout << argv[i] << endl;
    }
    cin.get();
    return 0;
}

使用ShellExecute调用

#usr/bin/env python
#-*- coding: utf-8 -*-

import win32api
import win32event
import win32process

def main():
    exePath = "E:\python_wk\callExeOnWin\helloSomething.exe"
    param = "hello world abc 123"
    win32api.ShellExecute(0,
                        "open",
                        exePath,
                        param,
                        '',
                        1)
if '__main__' == __name__:
    main()

可以看到参数用空格隔开即可

使用CreateProcess调用

#usr/bin/env python
#-*- coding: utf-8 -*-

import win32api
import win32event
import win32process
def main():
    exePath = "E:\python_wk\callExeOnWin\helloSomething.exe"
    param = "hello world abc 123"

    param = exePath + " " + param

    handle = win32process.CreateProcess(exePath,
                                    param,
                                    None,
                                    None,
                                    0,
                                    win32process.CREATE_NEW_CONSOLE,
                                    None,
                                    None,
                                    win32process.STARTUPINFO())
if '__main__' == __name__:
    main()

因为由C++编译的exe文件的第一个参数是自己本身,也就是在C++程序中 argv[0] 的值是exe文件本身的路径,可以看到,在使用CreateProcess调用exe时,我们需要将exe路径加入到参数中,而在ShellExecute中是不需要的。

你可能感兴趣的:(python)