使用 ms 编译器在 Windows 上构建 python 模块

发布于 2024-10-02 20:15:29 字数 2224 浏览 7 评论 0原文

我正在尝试在 PC\example_nt 下构建 python 源发行版附带的示例,

我将 example.c 和 setup.py 复制到目录 C:\mymod

当我运行 C:\Python27\python.exe setup 时.py install 我收到错误....

error: Unable to find vcvarsall.bat

我在 distutils 中进行了一些挖掘,发现它是在 microsoft Visual Studio 版本 9 之后进行的但我只有版本 8。显然它试图获取版本 9,因为 C:\Python27 下的 python 是用什么编译的。

我修改了 setup.py 并将以下内容放在最顶部。

from distutils import msvc9compiler
msvc9compiler.VERSION = 8.0

完成此操作后,我能够编译并得到以下内容...

C:\mymod>C:\Python27\python.exe setup.py install
running install
running build
running build_ext
building 'example' extension
creating build
creating build\temp.win32-2.7
creating build\temp.win32-2.7\Release
C:\Program Files\Microsoft Visual Studio 8\VC\BIN\cl.exe /c /nologo /Ox /MD /W3
/GS- /DNDEBUG -IC:\Python27\include -IC:\Python27\PC /Tcexample.c /Fobuild\temp.
win32-2.7\Release\example.obj
example.c
creating build\lib.win32-2.7
C:\Program Files\Microsoft Visual Studio 8\VC\BIN\link.exe /DLL /nologo /INCREME
NTAL:NO /LIBPATH:C:\Python27\libs /LIBPATH:C:\Python27\PCbuild /EXPORT:initexamp
le build\temp.win32-2.7\Release\example.obj /OUT:build\lib.win32-2.7\example.pyd
 /IMPLIB:build\temp.win32-2.7\Release\example.lib /MANIFESTFILE:build\temp.win32
-2.7\Release\example.pyd.manifest
   Creating library build\temp.win32-2.7\Release\example.lib and object build\te
mp.win32-2.7\Release\example.exp
C:\Program Files\Microsoft Visual Studio 8\VC\BIN\mt.exe -nologo -manifest build
\temp.win32-2.7\Release\example.pyd.manifest -outputresource:build\lib.win32-2.7
\example.pyd;2
running install_lib
copying build\lib.win32-2.7\example.pyd -> C:\Python27\Lib\site-packages
running install_egg_info
Removing C:\Python27\Lib\site-packages\example-1.0-py2.7.egg-info
Writing C:\Python27\Lib\site-packages\example-1.0-py2.7.egg-info

现在,当我运行 C:\Python27\python.exe 并尝试导入示例时,我得到以下内容...

ImportError: DLL load failed: The specified module could not be found.

我做了吗有事吗? VS8 不支持创建 Python 2.7 模块吗? 我应该怎么办?

最终我需要为一些 Windows C 库构建绑定,以便我可以使用 Python 来扩展一些专有程序而不是 C。我必须使用 VS8 来创建 C 扩展。那么我该怎么办呢?

请指教。

谢谢, ~埃里克

I am trying to build the example that comes with the source distribution of python under PC\example_nt

I copied example.c and setup.py to a directory C:\mymod

When I run C:\Python27\python.exe setup.py install I get the error....

error: Unable to find vcvarsall.bat

I did some digging around in distutils and saw that it was going after version 9 of microsoft visual studio but I only have version 8. Apparently it tries to get version 9 because of what the python under C:\Python27 was compiled with.

I modified setup.py and put the following at the very top.

from distutils import msvc9compiler
msvc9compiler.VERSION = 8.0

After doing this I was able to compile and got the following....

C:\mymod>C:\Python27\python.exe setup.py install
running install
running build
running build_ext
building 'example' extension
creating build
creating build\temp.win32-2.7
creating build\temp.win32-2.7\Release
C:\Program Files\Microsoft Visual Studio 8\VC\BIN\cl.exe /c /nologo /Ox /MD /W3
/GS- /DNDEBUG -IC:\Python27\include -IC:\Python27\PC /Tcexample.c /Fobuild\temp.
win32-2.7\Release\example.obj
example.c
creating build\lib.win32-2.7
C:\Program Files\Microsoft Visual Studio 8\VC\BIN\link.exe /DLL /nologo /INCREME
NTAL:NO /LIBPATH:C:\Python27\libs /LIBPATH:C:\Python27\PCbuild /EXPORT:initexamp
le build\temp.win32-2.7\Release\example.obj /OUT:build\lib.win32-2.7\example.pyd
 /IMPLIB:build\temp.win32-2.7\Release\example.lib /MANIFESTFILE:build\temp.win32
-2.7\Release\example.pyd.manifest
   Creating library build\temp.win32-2.7\Release\example.lib and object build\te
mp.win32-2.7\Release\example.exp
C:\Program Files\Microsoft Visual Studio 8\VC\BIN\mt.exe -nologo -manifest build
\temp.win32-2.7\Release\example.pyd.manifest -outputresource:build\lib.win32-2.7
\example.pyd;2
running install_lib
copying build\lib.win32-2.7\example.pyd -> C:\Python27\Lib\site-packages
running install_egg_info
Removing C:\Python27\Lib\site-packages\example-1.0-py2.7.egg-info
Writing C:\Python27\Lib\site-packages\example-1.0-py2.7.egg-info

Now when I run C:\Python27\python.exe and try to import example I get the following...

ImportError: DLL load failed: The specified module could not be found.

Did I do something wrong? Is VS8 unsupported for creating Python 2.7 modules?
What should I do?

Ultimately I need to build bindings for some Windows C library so that I can use Python to extend some proprietary program instead of C. I have to use VS8 for creating the C extension. So where does that leave me.

Advice please.

Thanks,
~Eric

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅浅 2024-10-09 20:15:29

一般来说,您必须使用与构建 python 相同版本的 VS 来构建 python 模块。您有多种选择:

  1. 使用 Python2.6,我认为是 VS8(或者甚至更早的版本,我确信 2.5 和 2.6 之间有变化)
  2. 使用 VS9。我认为你不能,因为你使用的专有库是用 VS8 构建的。与 python 实际发生的问题相同。
  3. 使用 ctypes 创建绑定。这可能很困难,而且很容易使你的程序崩溃。
  4. 使用 VS8 从源代码构建 Python2.7。如果您由于某种原因无法使用 Python2.6,那么这可能是最好的选择。

如果可行的话我会推荐选项 1。

Generally speaking you have to build the python modules using the same version of VS as python was built with. You have several options:

  1. Use Python2.6, which i think is VS8 (or an even earlier version, I'm sure there was a change between 2.5 and 2.6)
  2. Use VS9. I assume you can't because the proprietary library you are using was built with VS8. Same problem as is happening with python really.
  3. Create your bindings using ctypes. This can be hard and its very easy to crash your program.
  4. Build Python2.7 from source using VS8. If you can't use Python2.6 for some reason then this is probably the best bet.

I'd recommend option 1 if it works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文