I'm working on a Python package named "lehmer" that includes a bunch of extension modules written in C. Currently, I have a single extension module, "rng". I am using Python's Distutils to build and install the module. I can compile and install the module, but when I try to import the module using import lehmer.rng
or from lehmer import rng
, the Python interpreter throws an ImportError
exception. I can import "lehmer" fine.
我正在开发一个名为“lehmer”的Python包,其中包含一堆用C编写的扩展模块。目前,我有一个扩展模块“rng”。我正在使用Python的Distutils来构建和安装模块。我可以编译和安装模块,但是当我尝试使用import lehmer.rng或lehmer import rng导入模块时,Python解释器会抛出ImportError异常。我可以输入“lehmer”罚款。
Here are the contents of my setup.py
file:
以下是我的setup.py文件的内容:
from distutils.core import setup, Extension
exts = [Extension("rng", ["lehmer/rng.c"])]
setup(name="lehmer",
version="0.1",
description="A Lehmer random number generator",
author="Steve Park, Dave Geyer, and Michael Dippery",
maintainer="Michael Dippery",
maintainer_email="mpd@cs.wm.edu",
packages=["lehmer"],
ext_package="lehmer",
ext_modules=exts)
When I list the contents of Python's site-packages
directory, I see the following:
当我列出Python的site-packages目录的内容时,我看到以下内容:
th107c-4 lehmer $ ls /scratch/usr/lib64/python2.5/site-packages/lehmer
__init__.py __init__.pyc rng.so*
My PYTHONPATH
environment variable is set correctly, so that's not the problem (and as noted before, I can import lehmer
just fine, so I know that PYTHONPATH
is not the issue). Python uses the following search paths (as reported by sys.path
):
我的PYTHONPATH环境变量设置正确,所以这不是问题(如前所述,我可以很好地导入lehmer,所以我知道PYTHONPATH不是问题)。 Python使用以下搜索路径(由sys.path报告):
['', '/scratch/usr/lib64/python2.5/site-packages', '/usr/lib/python25.zip', '/usr/lib64/python2.5', '/usr/lib64/python2.5/plat-linux2', '/usr/lib64/python2.5/lib-tk', '/usr/lib64/python2.5/lib-dynload', '/usr/lib64/python2.5/site-packages', '/usr/lib64/python2.5/site-packages/Numeric', '/usr/lib64/python2.5/site-packages/PIL', '/usr/lib64/python2.5/site-packages/SaX', '/usr/lib64/python2.5/site-packages/gtk-2.0', '/usr/lib64/python2.5/site-packages/wx-2.8-gtk2-unicode', '/usr/local/lib64/python2.5/site-packages']
Update
It works when used on an OpenSUSE 10 box, but the C extensions still fail to load when tested on Mac OS X. Here are the results from the Python interpreter:
它在OpenSUSE 10盒子上使用时有效,但在Mac OS X上测试时C扩展仍然无法加载。以下是Python解释器的结果:
>>> sys.path
['', '/usr/local/lib/python2.5/site-packages', '/opt/local/lib/python25.zip', '/opt/local/lib/python2.5', '/opt/local/lib/python2.5/plat-darwin', '/opt/local/lib/python2.5/plat-mac', '/opt/local/lib/python2.5/plat-mac/lib-scriptpackages', '/opt/local/lib/python2.5/lib-tk', '/opt/local/lib/python2.5/lib-dynload', '/opt/local/lib/python2.5/site-packages']
>>> from lehmer import rng
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name rng
>>> import lehmer.rngs
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named rngs
>>> import lehmer.rng
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named rng
>>> from lehmer import rngs
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name rngs
1 个解决方案
#1
3
For the record (and because I am tired of seeing this marked as unanswered), here were the problems:
为了记录(因为我厌倦了看到这标记为未答复),这里是问题:
- Since the current directory is automatically added to the Python packages path, the interpreter was first looking in the current directory for packages; since some C modules were not compiled in the current directory, the interpreter couldn't find them. Solution: Don't launch the interpreter from the same directory in which your working copy of the code is stored.
- Distutils did not install the module with the correct permissions on OS X. Solution: Fix the permissions.
由于当前目录自动添加到Python包路径,因此解释器首先在当前目录中查找包;由于某些C模块未在当前目录中编译,因此解释器无法找到它们。解决方案:不要从存储代码工作副本的同一目录中启动解释器。
Distutils没有在OS X上安装具有正确权限的模块。解决方案:修复权限。
#1
3
For the record (and because I am tired of seeing this marked as unanswered), here were the problems:
为了记录(因为我厌倦了看到这标记为未答复),这里是问题:
- Since the current directory is automatically added to the Python packages path, the interpreter was first looking in the current directory for packages; since some C modules were not compiled in the current directory, the interpreter couldn't find them. Solution: Don't launch the interpreter from the same directory in which your working copy of the code is stored.
- Distutils did not install the module with the correct permissions on OS X. Solution: Fix the permissions.
由于当前目录自动添加到Python包路径,因此解释器首先在当前目录中查找包;由于某些C模块未在当前目录中编译,因此解释器无法找到它们。解决方案:不要从存储代码工作副本的同一目录中启动解释器。
Distutils没有在OS X上安装具有正确权限的模块。解决方案:修复权限。