python使用shellexecute系统找不到指定的文件_shellexecute - 如何从Python执行程序? 由于路径中的空格,os.system失败

当Python脚本使用os.system执行带有空格的路径时会遇到问题。可以使用subprocess.call或者os.startfile来解决这个问题,它们能更妥善地处理路径中的空格。例如:`subprocess.call(['C:\Temp\a b c\Notepad.exe', 'C:\test.txt'])` 或者 `os.startfile('C:\Temp\a b c\Notepad.exe')`。这些方法允许正确传递参数且无需担心路径解析问题。" 131011681,7822332,龙芯2K1000 Pmon配置与编译实战,"['嵌入式开发', '龙芯', '汇编', '硬件配置', '编译工具']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shellexecute - 如何从Python执行程序? 由于路径中的空格,os.system失败

我有一个需要执行外部程序的Python脚本,但由于某种原因失败了。

如果我有以下脚本:

import os;

os.system("C:\\Temp\\a b c\\Notepad.exe");

raw_input();

然后它失败并出现以下错误:

'C:\ Temp \ a'不被识别为内部或外部命令,可操作程序或批处理文件。

如果我用引号来逃避程序:

import os;

os.system('"C:\\Temp\\a b c\\Notepad.exe"');

raw_input();

然后它工作。 但是,如果我添加一个参数,它会再次停止工作:

import os;

os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');

raw_input();

执行程序并等待程序完成的正确方法是什么? 我不需要从中读取输出,因为它是一个可视化程序,可以完成工作然后退出,但我需要等待它完成。

另请注意,将程序移动到非间隔路径也不是一种选择。

这也不起作用:

import os;

os.system("'C:\\Temp\\a b c\\Notepad.exe'");

raw_input();

注意交换的单/双引号。

在此处有或没有记事本参数,它会失败并显示错误消息

文件名,目录名或卷标语法不正确。

8个解决方案

257 votes

subprocess.call将避免必须处理各种shell的引用约定的问题。 它接受一个列表而不是字符串,因此参数更容易分隔。即

import subprocess

subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])

Brian answered 2019-02-23T17:48:00Z

60 votes

这是一种不同的做法。

如果您正在使用Windows,则以下操作类似于在资源管理器中双击该文件,或将文件名作为参数提供给DOS“start”命令:文件将打开,其中任何应用程序(如果有)与其扩展名相关联。

filepath = 'textfile.txt'

import os

os.startfile(filepath)

例:

import os

os.startfile('textfile.txt')

如果记事本与.txt文件相关联,这将使用记事本打开textfile.txt。

user16738 answered 2019-02-23T17:48:41Z

31 votes

最外面的引号由Python本身使用,而Windows shell则看不到它。 如上所述,Windows只能理解双引号。Python会在Windows上将forward-slashed转换为反斜杠,因此您可以使用

os.system('"C://Temp/a b c/Notepad.exe"')

'由Python使用,然后将“[C:// Temp / a] b c / Notepad.exe”(作为Windows路径,不需要双反斜杠)传递给CMD.EXE

Daniel Serodio answered 2019-02-23T17:49:13Z

16 votes

至少在Windows 7和Python 3.1中,如果命令路径中有空格,Windows中的subprocess.call希望命令行加双引号。 例如:

TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'

os.system(TheCommand)

一个真实的例子让我感到困惑的是在VirtualBox中克隆了一个驱动器。 由于某些访问权限问题,上面的subprocess.call解决方案无法正常工作,但当我双引命令时,os.system变得高兴:

TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \

+ ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'

os.system(TheCommand)

Paul Hoffman answered 2019-02-23T17:49:46Z

7 votes

import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly

except: pass

rahul answered 2019-02-23T17:50:04Z

4 votes

我怀疑它与在Windows中使用快捷方式时的问题相同...试试这个:

import os;

os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");

Matthew Scharley answered 2019-02-23T17:50:29Z

2 votes

对于python> = 3.5 subprocess.run应该用来代替subprocess.call

[https://docs.python.org/3/library/subprocess.html#older-high-level-api]

import subprocess

subprocess.run(['notepad.exe', 'test.txt'])

gbonetti answered 2019-02-23T17:51:02Z

0 votes

假设我们想运行你的Django Web服务器(在Linux中)你的路径之间有空格(路径= manage.py),所以执行以下操作:

import subprocess

args = ['{}/manage.py'.format('/home//'), 'runserver']

res = subprocess.Popen(args, stdout=subprocess.PIPE)

output, error_ = res.communicate()

if not error_:

print(output)

else:

print(error_)

[注意]:

不要忘记访问权限:manage.py

manage.py是可执行文件:chmod +x manage.py

Benyamin Jafari answered 2019-02-23T17:51:49Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值