如何从python运行exe文件?

如何从python运行exe文件?,python,python-3.x,subprocess,os.system,Python,Python 3.x,Subprocess,Os.system,我尝试使用os.system库从本地python项目中的特定路径在后台运行exe。 我已成功更改文件夹,如“cd”命令,但无法运行该文件 这适用于运行在Windows 64位、python 3.5.3上的python项目 文件.exe位于程序目录下 import os os.system("cd C:\Users\User\AppData\Windows\Start Menu\Programs") subprocess.Popen("file.exe") 错误: {OSError}[WinEr

我尝试使用os.system库从本地python项目中的特定路径在后台运行exe。 我已成功更改文件夹,如“cd”命令,但无法运行该文件

这适用于运行在Windows 64位、python 3.5.3上的python项目

文件.exe位于程序目录下

import os
os.system("cd C:\Users\User\AppData\Windows\Start Menu\Programs")
subprocess.Popen("file.exe")
错误:

{OSError}[WinError 193]%1不是有效的Win32应用程序

我看到了关于这个问题的其他帖子,但我无法解决它。
有什么想法吗?

你能看看这是否有效吗

   import os 

    # change the current directory 
    # to specified directory 
    os.chdir(r"C:\Users\User\AppData\Windows\Start Menu\Programs") 
    subprocess.Popen("file.exe")

你能看看这是否有效吗

   import os 

    # change the current directory 
    # to specified directory 
    os.chdir(r"C:\Users\User\AppData\Windows\Start Menu\Programs") 
    subprocess.Popen("file.exe")
问题是系统命令不起作用。它可以工作,但是在一个单独的子流程中,它会立即退出。当前目录也不会传播到调用进程,因为您没有检查返回代码,所以即使使用不存在的目录,命令也不会失败。请注意,它发生在这里,因为目录名中有空格,并且没有引用

您必须使用os.chdir,但您甚至不需要它

如果要在特定位置运行命令,只需传递该命令的绝对路径,并且由于它使用字符串文字,因此始终使用r前缀以避免某些\t或\n字符被解释为特殊字符。。。。例如,在Python3中,命令行提供了一个错误,但在Python2中没有问题…:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 5-6: truncated \UXXXXXXXX escape
所以总是使用原始前缀。下面是我将如何重写的:

current_dir = r"C:\Users\User\AppData\Windows\Start Menu\Programs"
subprocess.Popen(os.path.join(current_dir,"file.exe"))
如果您确实需要当前目录与exe相同,请使用cwd参数。还要获取Popen的返回值,以便能够等待/poll/kill/where并获取命令退出代码:

p = subprocess.Popen(os.path.join(current_dir,"file.exe"),cwd=current_dir)
# ...
return_code = p.wait()
作为旁注,请注意:

p = subprocess.Popen("file.exe",cwd=current_dir)
即使file.exe在current_dir中也不起作用,除非您设置shell=True,但出于安全性/可移植性的原因,最好也避免这样做

请注意,os.system被弃用的原因很多。始终使用子流程模块,如果有参数,则始终使用参数列表而不是字符串,并尽可能避免shell=True。

问题是系统命令不起作用。它可以工作,但是在一个单独的子流程中,它会立即退出。当前目录也不会传播到调用进程,因为您没有检查返回代码,所以即使使用不存在的目录,命令也不会失败。请注意,它发生在这里,因为目录名中有空格,并且没有引用

您必须使用os.chdir,但您甚至不需要它

如果要在特定位置运行命令,只需传递该命令的绝对路径,并且由于它使用字符串文字,因此始终使用r前缀以避免某些\t或\n字符被解释为特殊字符。。。。例如,在Python3中,命令行提供了一个错误,但在Python2中没有问题…:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 5-6: truncated \UXXXXXXXX escape
所以总是使用原始前缀。下面是我将如何重写的:

current_dir = r"C:\Users\User\AppData\Windows\Start Menu\Programs"
subprocess.Popen(os.path.join(current_dir,"file.exe"))
如果您确实需要当前目录与exe相同,请使用cwd参数。还要获取Popen的返回值,以便能够等待/poll/kill/where并获取命令退出代码:

p = subprocess.Popen(os.path.join(current_dir,"file.exe"),cwd=current_dir)
# ...
return_code = p.wait()
作为旁注,请注意:

p = subprocess.Popen("file.exe",cwd=current_dir)
即使file.exe在current_dir中也不起作用,除非您设置shell=True,但出于安全性/可移植性的原因,最好也避免这样做

请注意,os.system被弃用的原因很多。始终使用子流程模块,如果有参数,则始终使用参数列表而不是字符串,并尽可能避免shell=True。

问题已解决。 谢谢大家,问题是管理权限。。以管理员身份启动pycharm。 正如我所说,我可以使用os.listdir查看文件,但是当我尝试运行它时,错误开始弹出。 我认为主要的问题是操作系统从python进程继承当前特权。

问题解决了。 谢谢大家,问题是管理权限。。以管理员身份启动pycharm。 正如我所说,我可以使用os.listdir查看文件,但是当我尝试运行它时,错误开始弹出。
我认为主要问题是os.system从python进程继承当前特权。

您尝试过os.system./file.exe吗?我可能错了,但我认为使用os.system调用更改目录只会更改该调用的目录。打开外壳,执行命令,关闭外壳。改为使用os.chdir更改脚本工作目录。@SyntaxVoid它对我有效。os.system将下一个命令的路径更改为well@Moshe,很奇怪。这不是它在我的机器上的行为方式,即使我以admin os.getcwd运行python;os.systemcd桌面;getcwd将显示相同的目录,不会发生任何更改。无论我是在交互式python shell中,还是在运行.py文件,都会发生这种情况。您是否尝试过os.system./file.exe?我可能错了,但我认为使用os.system调用更改目录只会更改该调用的目录。打开外壳,执行命令,关闭外壳。使用os.chdir代替cha
nge脚本工作目录。@SyntaxVoid它对我有效。os.system将下一个命令的路径更改为well@Moshe,很奇怪。这不是它在我的机器上的行为方式,即使我以admin os.getcwd运行python;os.systemcd桌面;getcwd将显示相同的目录,不会发生任何更改。无论我是在交互式python shell中,还是在运行.py文件,都会发生这种情况。由于某些原因,我无法从python访问该文件。虽然我在os.ListDir中看到它不工作,但由于某些原因,我无法从python访问该文件。虽然我在os.listdir中看到了它