使用subprocess调用shp2pgsql创建PostgreSQL表时遇文件找不到错误
首先得给你指出来:你遇到的这个WindowsError: [Error 2] 根本不是找不到你的cities.shp文件(毕竟os.path.isfile已经返回True了),而是系统找不到shp2pgsql这个工具本身!
问题根源
在Windows环境下,subprocess.Popen调用外部命令时,如果命令对应的可执行文件不在系统环境变量PATH里,也没指定完整路径,Python就会抛出“系统找不到指定文件”的错误——这里的“文件”指的是shp2pgsql.exe,不是你传入的shapefile。
两种可行的解决办法
1. 把shp2pgsql加入系统PATH
找到你PostgreSQL安装目录下的bin文件夹(一般是C:\Program Files\PostgreSQL\[你的版本号]\bin),把这个路径添加到系统环境变量PATH里,然后重启你的Python运行环境,再跑代码试试。
2. 直接指定shp2pgsql的完整路径
不用改环境变量,直接在代码里写死shp2pgsql.exe的完整路径,比如:
create_table = subprocess.Popen( ['C:/Program Files/PostgreSQL/14/bin/shp2pgsql.exe', '-p', '-I', '-s', str(srid), '-W', encoding, filepath, table], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True )
记得把路径替换成你自己的PostgreSQL版本和安装路径哦。
快速验证方法
打开命令提示符(CMD),直接输入shp2pgsql,如果提示“'shp2pgsql' 不是内部或外部命令,也不是可运行的程序或批处理文件”,那就百分之百是PATH的问题,按上面的方法解决就好。
另外提一句,你代码里的打印语句有个小瑕疵:print "does file exist".format(os.path.isfile(filepath))应该改成print "does file exist? {}".format(os.path.isfile(filepath)),不过这和当前的错误没关系啦。
内容的提问来源于stack exchange,提问作者Daniel

