经过大量的反复试验、谷歌搜索、键盘损坏、各种论坛/聊天问答环节和头部受伤——更不用说必须为几个问题创建自己的修复程序/解决方法——我终于成功地构建了并为 Windows x64 安装 64 位版本的 PySpatiaLite 3.0.1。呜呼!
考虑到我到达终点有多么困难(几个星期!),我想分享本教程作为对特定问题的回答,“我如何构建和安装 64 位版本的 PySpatiaLite视窗?” 与其创建一个新的自我回答的问题线程,不如只回答这个关于在 Windows 上安装 PySpatiaLite 的问题,假设它会出现在任何搜索如何在 64 位构建中执行它的人身上。所以这里...
注意: Markdown 在这个网站上的工作方式,我不能完全控制列表的编号模式;它在每个标题后重置为 1。因此,虽然在原始教程中我可能将某些东西编号为 30,但在这里我必须注意它显示为构建 xyz 等下的第 5 步。你能做什么?
操作方法:在 WINDOWS 上安装 64 位 PYSPATIALITE
在 40 个非常容易遵循的步骤中- 不,真的!
这里有很多步骤,但这仅仅是因为我将它们分解成尽可能小的组件;所以不要感到不知所措。在高层次上,你实际上只做 5 件事:
- 下载所有必要的资源
- 设置构建环境(你可能已经这样做了)
- 构建和安装依赖库
- 构建和安装 PySpatiaLite
- 测试您的安装
而已。没那么难,真的吗?哦,是的!但希望您遵循这些步骤并没有那么困难。对于你们中的许多人来说,这些步骤中添加的细节似乎有点过头了,特别是如果你以前是从源代码构建的(我没有——真的!),但我不对观众的技能水平或专业知识做任何假设; 所以这个 How-To 的编写是为了让一个相对的初学者(比如我!)应该能够遵循它。
注意:请注意本文档中的注释,因为它们经常指出一些问题或乍一看不会很明显的事情。
注意:尽可能使用最新的稳定版本,而不是测试版或夜间快照。有时,您别无选择,只能抓住最前沿的 beta 版本(如果您认识人,也可以是 alpha 版本)。例如,您将需要 GEOS 的最新稳定版本和夜间构建来解决问题。
注意:当您访问下面的一些链接时,您可能会注意到您打算构建的其他库的一些预编译二进制文件。我强烈建议你不要使用这些。您无法确定它们是在什么环境中构建的,如果您在自己的环境中构建它们,事情会更好/更安全/更确定它们会正常工作。Gettext 的例外。
ME:代表“我的环境”作为比较基础
要求:
一个 Microsoft Windows x64 操作系统(Duh!我们在这里做什么?)
我: MS Windows 7 Home x64
MS Visual Studio Express C++ (MSVC) 2008
ME:我下载并安装了一个虚拟 ISO 映像,而不是使用基于 Web 的安装程序
注意:选择“vcsetup.exe”(C++)而不是“vcssetup.exe”(C#) - 注意额外的's'?你会认为他们会让它更明显一点,是吗?完整版的 MSVC 也同样适用,但和我一样,我认为免费对您来说很有价值。
注意:可能适用于 MSVC 2010,但我强烈建议坚持使用编译 Python 的相同版本,因为有时它可能有点棘手,这就是为什么我建议使用 MSVC 而不是 mingw-w64 或 Cygwin 构建的原因。
MS 软件开发工具包 (SDK) 7.0 amd64 .NET Framework 3.5
ME:还在这里下载了 ISO 映像。
注意:可能适用于 SDK 7.1 amd64 .NET Framework 4.0 (MSVC 2010),但请参阅上面的注释
Python 2.7 x64
ME: Python 2.7.3 x64(预编译 Win x64 安装)
注意:可能适用于 2.5+ 版本,包括 3.x
最新的 GNU iconv 源代码
ME: libiconv 1.9.2
最新 Proj.4 源代码
ME: libproj 4.8.0
最新的 GEOS 源代码
ME: libgeos 3.3.5 (svn_trunk) + 2012-07-28 nightly snapshot
注意:也可以从这个页面下载一个 nightly snapshot;我们需要从中复制一个丢失的目录,但我们不想用它来构建库本身。
最新的 GNU Gettext Runtime BINARY
ME: Gettext 0.18.1.1-2
注意:由于与 iconv 的循环依赖,我们在此处使用二进制文件而不是从源代码构建;你可以解决它,但这更容易/更快/更简单/更少压力。
最新的 PySpatialLite 包
ME: PySpatialLite 3.0.1
注意:在撰写本文时,3.0.1 是可用的最新版本;让这个版本工作的特定怪癖可能不会与任何其他版本完全匹配,但编译依赖库所需的大部分步骤仍然应该适用。
Notepad++或其他功能齐全的编辑器应用程序。
注意:当然,MS NotePad 会在紧要关头完成,但它会让这个过程变得更加困难。我推荐一些更强大的东西,而 Notepad++ 恰好是我的最爱。
设置构建环境:
安装 MSVC 2008,并运行 Windows 更新(有时 2 次或更多次以获取所有内容),然后当没有更新时...
安装 SDK 7.0,然后再次运行 Windows 更新(等等等等,令人作呕),然后当没有更新时......
打开 Windows 文件夹(或 Windows 资源管理器)并导航到“C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC”
编辑“vcvarsall.bat”
在指示的行号处找到如下所示的代码:
Line 19: if not exist "%~dp0bin\amd64\vcvarsamd64.bat" goto missing
Line 20: call "%~dp0bin\amd64\vcvarsamd64.bat"
这些行中的路径是完全错误的。不要问我为什么。我猜微软那天他们的集体评估,但如果你只是删除'\amd64'并将每行中的文件名更改为'vcvars64.bat'应该没问题。最终结果应如下所示:
Line 19: if not exist "%~dp0bin\vcvars64.bat" goto missing
Line 20: call "%~dp0bin\vcvars64.bat"
注意:您可以通过打开命令窗口(开始 --> 运行 --> 键入 'cmd' --> 确定)并运行以下命令来进行测试:
c:\> vcvarsall x64
您应该得到一系列输出,说明它是“设置使用 Microsoft Visual Studio 2008 x64 工具的环境”。继续并关闭此窗口。
现在让我们测试您的 SDK 7.0 环境。单击开始 --> 所有程序 --> Microsoft Windows SDK 7.0 --> CMD Shell。如果一切正常,您应该有一个带有
黄色文本的命令行窗口。这表示 64 位环境。完美的!您现在可以关闭此窗口。
注意:您可能想要创建 SDK 7.0 CMD Shell 的快捷方式 - 我们将在整个过程中经常使用它。
确定最终要安装依赖库的位置。如果该文件夹尚不存在,请立即创建该文件夹。记住您选择的路径,因为我们会经常提到它。为简单起见,我们将在示例代码中将此称为“\Install”或有时称为“C:\Install”。
决定在此安装过程中将临时构建文件保存在何处。这不应与
您的“\Install”文件夹位于同一位置。在示例代码中,我们将其称为“\Temp”或“C:\Temp”。
将 GNU Gettext 二进制文件解压缩到“\Temp”,这应该会生成一个名为“\Temp\Gettext-0.18.1.1-2”或类似的文件夹。
将 libintl.dll 从 '\Temp\Gettext-0.18.1.1-2\bin' 复制到 '\Install\bin' (您必须自己创建 '\bin'),或者只是复制并粘贴所有 Gettext (' \bin'、''\lib' 等)子文件夹放入 '\Install'。无论哪种方式都可以正常工作。
导航到“\Install\bin”,复制“libintl.dll”并将其命名为“intl.dll”。这对于一些以不同名称查找它的库来说是必要的。现在我们准备好继续构建库了......
构建依赖库:
- 将每个库(Proj.4、GEOS 和 iconv)解压缩到 '\Temp' 中它们自己的文件夹中。我建议将每个文件夹重命名为简短但具有描述性的名称(例如“\Temp\Proj4”),因为一遍又一遍地输入“\Temp\Proj-4.8.0”(或更长!)会让人厌烦。
构建图标v:
打开您的SDK CMD Shell,并将目录更改为您的iconv 文件夹(例如'cd c:\temp\iconv')。
键入以下两个命令之一:
Single-threaded static lib: (recommended)
c:\Temp\iconv\> nmake install /f makefile.msvc MFLAGS=-ML PREFIX=c:\Install
Multi-threaded static lib: (so far it's working for me)
c:\Temp\iconv\> nmake install /f makefile.msvc MFLAGS=-MT PREFIX=c:\Install
将 'c:\Install' 替换为您的 '\Install' 路径。经过很长时间进行一些神秘的 c 样式链接等之后,该过程最终将完成,并且假设您没有看到破坏构建过程的错误(例如,'cl.exe exited with status 2') - 忽略它是相对安全的无数的警告——你已经准备好继续前进了。
注意:如果您愿意,您可以通过在“nmake”之后立即删除“install”然后重新运行上述命令,分两个单独的步骤构建和安装库,但有什么意义呢?如果构建部分失败,它无论如何都不会安装。
建设项目 4:
仍然在 CMD Shell 中,将目录更改为您的 '\Temp\Proj4' 文件夹(例如,'cd c:\temp\proj4')。
键入以下命令:
c:\Temp\proj4\> nmake install-all /f makefile.vc INSTDIR=c:\Install
将 'c:\Install' 替换为您的 '\Install' 路径。
注意:此处生成文件的扩展名现在是“.vc”而不是“.msvc”。两者似乎都是常见的做法。
注意:注意这里是'nmake install-all ...',它比'nmake install ...'更常见,特别是因为'install'是一个不应被覆盖的内置nmake命令。
注意:这是我见过使用“INSTDIR=”而不是“PREFIX=”的唯一实例。这本身并没有错,只是不是我见过的最常用的标准约定。
不要担心任何消息,例如“系统找不到指定的文件。已复制 0 个文件。安装脚本非常基本,即使您没有选择编译它们,它也会尝试安装所有 .DLL 和其他文件。
很短的时间后,该过程将完成(再次,错误严重,警告正常),您可以继续。
构建 GEOS:
这将需要一些额外的时间和精力。还记得您下载了最新的稳定版本和每晚的 snapshop 吗?如果您还没有,请继续将两者解压缩到单独的文件夹(例如,'\Temp\GEOS' 和'\Temp\GEOSnap')。
将文件夹“\Temp\GEOSnap\src\triangulate”复制到“\Temp\GEOS\src”。出于某种原因,在撰写本文时,最新的稳定版本中缺少 '\triangulate'。这就是我们所需要的'\GEOSnap';继续...
将GEOS\makefile.vc 补丁下载到 '\Temp\GEOS\makefile.vc'。- 说谢谢。'
将GEOS\src\makefile.vc 补丁下载到 '\Temp\GEOS\src\makefile.vc'。- 别客气。
注意:不要把这两者混为一谈!如果你这样做,对你来说会很糟糕。
除了实施 GEOS Trac #574 的修复之外,这两个用于 MSVC 的 makefile 添加代码以执行基本的安装和卸载功能(例如,'nmake install-all ...')。否则,您将需要手动复制所有文件(到处都是!)或使用其他构建方法,例如 CMake,这目前有点狡猾。
导航到“\Temp\GEOS\src”,编辑“dirlist.mk”,并在指示的行号处添加以下代码:
Line 45: triangulate \
此条目应低于“简化\”并高于“实用程序”。保存并关闭。
打开您的 CMD Shell,并将目录更改为您的 '\Temp\GEOS' 文件夹(例如,'cd c:\Temp\GEOS')。
键入以下命令:
c:\Temp\GEOS\> nmake install-all /f makefile.vc PREFIX=c:\Install
将“c:\Install”替换为“\Install”路径。经过很长很长时间,构建过程将完成。假设没有构建中断错误,您应该会收到 GEOS 安装在“\Install”中的通知。
这就是依赖库的全部内容;现在你(终于)准备好安装 PySpatiaLite 了!
构建和安装 PySpatiaLite:
将 PySpatiaLite 提取到其自己文件夹中的“\Temp”(例如“\Temp\PSL”)。
导航到“\Temp\PSL”,编辑名为“setup.py”的文件,并在指示的行号处修改以下代码:
Line 45: include_dirs = ['c:\Install\include']
Line 46: library_dirs = ['c:\Install\libs']
Line 47: libraries = ['geos','geos_c','proj','iconv']
Line 48: runtime_library_dirs = ['c:\Install\bin']
将上面的 'c:\Install' 部分替换为您自己的 '\Install' 路径,但保持 '\include'、'\libs' 和 '\bin' 部分不变。保存并关闭文件。
注意:您只是在第 47 行添加“,'iconv'”。
打开您的 CMD Shell 并将目录更改为您的 PySpatiaLite 文件夹(例如 'cd c:\Temp\PSL')。
键入以下命令:
c:\Temp\PSL\> python setup.py build
等待它下载空间合并,卸载它需要的文件,开始构建过程,最终失败。
是的。这是正确的。构建可能会失败(除非 Loki 在您阅读本文时已解决此问题)。
如果它确实失败了,请查看失败消息上方大约 14 行的控制台输出,您应该会看到隐藏在那些肮脏的代码中,例如:
-DVERSION = "3.0.1"
记下该号码;您将在未来的几个地方需要它。
最小化 CMD Shell,导航到“\Temp\PSL\amalgamation”,然后编辑标记为 spatialite.c 的文件。不要恐慌!它很大,很糟糕,很可怕,但我们只会做一个很小的改变:一个笨拙但有效的解决方法。
在指示的行号处添加以下代码:
Line 54: #define VERSION "3.0.1"
注意:将“3.0.1”替换为您在上面第 30 步(此处为 5)中看到的数字,并确保使用双引号 (") 而不是单引号 ('),否则它将失败。是的,我发现了困难的方式,不像你们那里的c大师谁知道得更好。
如果您想知道为什么我们必须等待它失败才能进行此更改,这是因为文件在您的系统上不存在,直到合并下载期间第一次构建尝试。就这样。
现在重新运行上面第 31 步中的命令,构建应该成功完成。
现在运行以下命令:
c:\Temp\PSL\> python setup.py install
和鲸鱼!假设没有更多麻烦的错误,您终于完成了构建/安装过程。吃一块饼干,拍拍自己的背。如果您愿意,您现在可以删除所有这些“\Temp”文件夹。现在进行一些测试以确保一切正常...
测试您的 PySpatiaLite x64 安装:
打开一个 CMD 窗口并将目录更改为 '..\Python27\Lib\site-packages\pyspatialite\test'(例如 'cd c:\python27...\test')。
不要启动 Python CLI。连续键入以下每个命令:
c:\python27\...\test\> python dbapi.py
c:\python27\...\test\> python dump.py
c:\python27\...\test\> python factory.py
c:\python27\...\test\> python hooks.py
c:\python27\...\test\> python regression.py
c:\python27\...\test\> python spatial.py
c:\python27\...\test\> python transactions.py
c:\python27\...\test\> python types.py
c:\python27\...\test\> python userfunctions.py
每次测试后,您应该会收到一份报告,说明它在 x.xxx 秒内运行了 xx 次测试,以及测试是通过(OK)还是失败。如果他们都通过了,你就是金子。
注意: “spatial.py”可能会失败,因为它期望 SpatiaLite 版本为“2.3.1”,而您的可能是“3.0.1”。不用担心,文件的简单编辑将解决此问题并允许您运行测试。
编辑“spatial.py”并将“2.3.1”更改为您实际安装的版本(还记得上面第 30 步(构建 PySpatiaLite - 第 5 步)中的那个数字吗?)在指示的行号处:
Line 18: self.assertEqual(row[0], "3.0.1")
再次运行“spatial.py”测试,它现在应该可以正常工作了。不太确定他们为什么要在这个测试中检查 pyspatialite 版本......继续前进!
内置测试很好,但更面向现实世界的测试怎么样?您知道,您在其中实际创建、填充、轮询和操作数据库中的数据吗?是的,这听起来就像门票!
滚动到在线 Spatialite Cookbook 的Language Bindings: Python部分的底部,并将“spatialite_sample.py”代码复制到新的 Python 文件中(例如“psl_sample.py”)。
在保存、关闭和运行此测试之前,请检查可能的复制/粘贴错误。确保代码在指示的行号处完全像这样读取:
Line 28: sql = "SELECT AddGeometryColumn('test_pt', "
Line 29: sql += "'geom', 4326, 'POINT', 'XY')"
我猜在从 HTML 代码到 Python 文件的翻译中会丢失一些东西,因为每次我剪切/粘贴这段代码时,第 28 行的结尾空格和引号都会掉到第 29 行的开头,并且来自多个来源, 也。容易修复,寿。
现在保存、关闭并运行它。我真的必须向您展示如何做到这一点吗?来吧!如需提示,请查看第 35 步(此处为第 2 步)。;-)
假设所有测试都通过了,包括内置和说明书示例,那么所有迹象都表明您拥有可靠的 64 位 PySpatiaLite 安装。
庆祝!(需要将其四舍五入到 40 ;-))
我希望这个“小”HOW-TO 对您有用。请随时提供反馈/更新/更正。
此致,
-RMWChaos,你友好的邻居邪恶霸主
http://www.thedarklands.com