如何使用subprocess.call运行Windows程序

时间:2019-08-02 08:54:44

标签: python windows subprocess psql

我正在尝试使用subprocess命令在Python脚本中运行psql命令。
我使用Windows环境,而psql命令旨在还原位于远程Linux服务器上的数据库。

代码段就是这个:

import os, sys
import subprocess

subprocess.call('psql -h ip_remote_server -p port -U user-d database -n schema --file="C:\Docs\script.sql"')  

这不起作用,控制台通知找不到指定的文件。

任何帮助将不胜感激!
谢谢!

1 个答案:

答案 0 :(得分:1)

是的,您的问题绝对是您的出路。我经历了在Windows 10上安装Python的麻烦并创建了以下脚本:

example.bat

@echo off                                                                                                                                                                           
echo This is a stand-in for your program                                                                                                                                            
echo arg1 = %1                                                                                                                                                                      
echo arg2 = %2                                                                                                                                                                      

example.py

import subprocess                                                                                                                                                                   

subprocess.call("C:\\Users\\bogus\\example.bat example arguments")                                                                                                              

控制台

C:\Users\bogus>python example.py
This is a stand-in for your program                                                                                                                                                 
arg1 = example                                                                                                                                                                      
arg2 = arguments                                                                                                                                                                    

如您所见,您无需传递shell=True或将命令拆分为一个列表。

如果您仔细查看subprocess.call的文档,将会看到以下内容(强调):

  

上面显示的参数仅仅是一些常见的参数。 完整函数签名与Popen构造函数的签名相同-此函数将除超时以外的所有提供的参数直接传递给该接口。

如果您仔细查看subprocess.Popen的文档,将会看到以下内容(强调):

  

在Windows上,如果args是序列,它将以Windows中将参数序列转换为字符串中所述的方式转换为字符串。这是因为底层的CreateProcess()对字符串进行操作。

关于将参数拆分为列表或传递shell=True的任何建议仅适用于POSIX,只有一个例外:

  

在Windows上唯一需要指定shell = True的情况是将要执行的命令内置到shell中(例如dir或copy)。您不需要shell = True即可运行批处理文件或基于控制台的可执行文件。