如何通过Python脚本带参数运行psql.exe?
问题解决:Python调用psql未正确传入重定向参数
问题原因
你遇到的问题核心是subprocess默认不解析shell的重定向语法:
- 用元组传参时,
< {file}会被psql当成普通命令行参数,而非shell的输入重定向指令,psql无法识别该参数,因此进入交互模式等待用户输入。 - 直接用字符串调用但未加
shell=True时,Windows平台下subprocess不会启动cmd解析重定向语法,同样无法生效。
两种解决方案
方案1:启用Shell解析(与cmd命令写法一致)
将完整命令作为字符串传递,并开启shell=True,让系统shell处理重定向逻辑:
def main(): # 给路径加双引号,避免路径含空格时出现解析错误 full_command = f'"{commandlet}" "{con_str}" < "{file}"' subprocess.check_call(full_command, shell=True)
方案2:通过stdin传递文件(更安全推荐)
不依赖shell重定向,直接将备份文件作为psql的标准输入传递,这种方式无shell注入风险,跨平台性更好:
def main(): with open(file, 'r', encoding='utf-8') as backup_file: subprocess.check_call([commandlet, con_str], stdin=backup_file)
验证
两种方法都能让psql正确读取备份文件并执行导入操作,不会再进入交互等待状态。
内容的提问来源于stack exchange,提问作者NikBulatov
相关产品推荐
相关产品推荐

