Python子进程在Windows和Ubuntu上的工作方式不同
在Flask应用程序中,我尝试运行PythonPython子进程在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)]
子流程
模块。所有这些都是在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'