Python使用os.system调用PowerShell时引号转义报错问题
问题解决:Python调用PowerShell命令引号转义报错
报错原因
你编写的f-string存在引号嵌套冲突:外层f-string使用双引号包裹,内层PowerShell命令的参数也使用了双引号,Python解析代码时会误判字符串的结束位置,直接触发语法错误。
解决方案
方案1:调整引号嵌套规则(快速修复)
调整内层外层引号的类型,避免相同引号直接嵌套,也可以配合转义符使用,修改后的代码如下:
def Message(): # 外层f-string用单引号,内层命令用双引号,变量包裹的单引号添加转义符 os.system(f'powershell -c "Invoke-WebRequest -Uri \'{url.get()}\' -OutFile \'{filename.get()}\'"')
如果怕转义符写错,可以直接用三重引号包裹f-string,不需要额外转义:
def Message(): os.system(f'''powershell -c "Invoke-WebRequest -Uri '{url.get()}' -OutFile '{filename.get()}'"''')
方案2:使用subprocess模块(更安全稳定)
os.system对特殊字符的处理能力较差,推荐改用Python标准库的subprocess模块,自动处理参数转义,还可以避免命令注入风险:
首先在文件头部添加导入:
import subprocess
修改Message函数:
def Message(): # 对输入内容的单引号做转义,避免PowerShell解析错误 safe_url = url.get().replace("'", "''") safe_filename = filename.get().replace("'", "''") cmd = ["powershell", "-c", f"Invoke-WebRequest -Uri '{safe_url}' -OutFile '{safe_filename}'"] subprocess.run(cmd, shell=True)
额外优化提示
你原有代码里两个输入框的标签坐标重叠,可以修改filetxt的y坐标避免重叠:
filetxt = Label(window, text = "Save File name").place(x = 10, y = 50)
内容的提问来源于stack exchange,提问作者123
相关产品推荐
相关产品推荐

