Mos*_*she 1 python subprocess os.system python-3.x
我尝试使用os.system库从本地python项目中的特定路径运行exe(在后台)。我设法更改了“ cd”命令之类的文件夹,但无法运行该文件。
这适用于在Windows 64BIT,Python 3.5.3上运行的python项目
file.exe位于“程序”目录下。
import os
os.system("cd C:\Users\User\AppData\Windows\Start Menu\Programs")
subprocess.Popen("file.exe")
Run Code Online (Sandbox Code Playgroud)
错误:
{OSError} [WinError 193]%1不是有效的Win32应用程序
我看到了有关此问题的其他帖子,但无法解决。有任何想法吗?
问题是该system命令不起作用。它“起作用”,但是在一个单独的子过程中立即退出。当前目录不会传播到调用过程(另外,由于您没有检查返回码,即使目录不存在,该命令也不会失败。请注意,此操作在此发生,因为目录名包含空格,并且不加引号...)。
您将不得不使用os.chdir它,但是您甚至不需要它。
如果要在特定位置运行命令,只需传递命令的绝对路径(并且由于它使用的是字符串文字,请始终使用r前缀来避免某些字符\t或\n字符被解释为特殊字符...)。例如,在python 3中,通过提供命令行存在错误(但是在python 2中可以...):
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 5-6: truncated \UXXXXXXXX escape
Run Code Online (Sandbox Code Playgroud)
因此,请始终使用原始前缀。这是我将其重写的方式:
current_dir = r"C:\Users\User\AppData\Windows\Start Menu\Programs"
subprocess.Popen(os.path.join(current_dir,"file.exe"))
Run Code Online (Sandbox Code Playgroud)
并且,如果您确实需要当前目录与exe相同,请使用cwd参数。还获得返回值,Popen以便能够等待/轮询/杀死/执行任何操作并获取命令退出代码:
p = subprocess.Popen(os.path.join(current_dir,"file.exe"),cwd=current_dir)
# ...
return_code = p.wait()
Run Code Online (Sandbox Code Playgroud)
作为旁注,请注意:
p = subprocess.Popen("file.exe",cwd=current_dir)
Run Code Online (Sandbox Code Playgroud)
即使已插入file.exe也不起作用current_dir(除非您进行了设置shell=True,但出于安全性/可移植性的原因,最好也避免这种情况)
请注意,os.system由于许多(良好)原因而已弃用。请始终使用subprocessmodule,如果有参数,请始终使用参数列表(而不是字符串),并尽量避免使用。shell=True
问题解决了。谢谢大家,问题是管理权限。以管理员身份启动pycharm。就像我说的 - 我能够使用 os.listdir() 查看该文件,但是当我尝试运行它时,错误开始弹出。我认为主要问题是 os.system() 从 python 进程继承当前权限。
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |