Python子进程在Windows和Ubuntu上的工作方式不同

Python子进程在Windows和Ubuntu上的工作方式不同,python,windows,subprocess,Python,Windows,Subprocess,在Flask应用程序中,我尝试运行Python子流程模块。所有这些都是在Ubuntu 12.04和Python2.7.8上运行的,现在我正在检查这个应用程序是否也能在Windows上运行(Win7 x64,Python2.7.12)。我在Linux上运行的代码: try: command = ["pgsql2shp -f %s -h %s -u %s -P %s %s main.%s" % (path, host, user, pword, db_name, region)]

在Flask应用程序中,我尝试运行Python
子流程
模块。所有这些都是在Ubuntu 12.04和Python2.7.8上运行的,现在我正在检查这个应用程序是否也能在Windows上运行(Win7 x64,Python2.7.12)。我在Linux上运行的代码:

try:
    command = ["pgsql2shp -f %s -h %s -u %s -P %s %s main.%s" % (path, host, user, pword, db_name, region)] 

    work = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
以上内容在Windows上不可用,返回的
stderr
类似于“文件名目录名或卷语法不正确”

但是:

上面的在Windows上工作!这是什么原因?该错误使我认为我的
path
变量不正确,但如下所示:

path = 'D:/adam/files/test.shp'
print path # D:/adam/files/test.shp

path = os.normpath(path)
print path # D:\adam\files\test.shp
path # 'D:\\adam\\files\\test.shp'

如果我从Windows cmd运行postgres“
pgsql2shp
,然后在字符串中粘贴
\
\\
/
的任意组合以及我在此处使用的数据,效果很好。看起来像是
pgsql2sgp
将路径本身转换为所需的格式。那么为什么它不能通过Python脚本和单独的
命令
变量工作呢?

请参见,该链接帮助我处理
子流程的其他问题,但对于这个问题,实际帮助我的是一条已经删除的注释(是您的,@cdarke?)-参数应该是一个列表,所以,我刚刚把
命令
放到
[]
中,一切都很好。这是我的评论,但我认为另一个问题回答得更全面。GLADY现在可以了。不要将参数列表与
shell=True
一起使用,尤其是在Windows上
subprocess.list2cmdline
不知道如何正确引用和转义cmd.exe和后续子进程的命令行。感谢您的评论。你说“尤其不是在Windows上”,但我在Ubuntu上尝试了
shell=False
,但无法使它以任何方式工作(使用
command
作为列表或字符串,并作为
[command]
命令传递)。在Ubuntu上使用
False
似乎对我不起作用
path = 'D:/adam/files/test.shp'
print path # D:/adam/files/test.shp

path = os.normpath(path)
print path # D:\adam\files\test.shp
path # 'D:\\adam\\files\\test.shp'