Python路径问题:调用zodbconvert时出现ImportError(FreeBSD 8.1)

1 投票
3 回答
1243 浏览
提问于 2025-04-16 16:19

我想这可能是一个Python路径的问题(在FreeBSD 8.1上)。

我正在尝试使用zodbconvert将一个Data.fs文件转换成Postgresql格式。我下载了RelStorage-1.5.0b2,并且正在运行:

/usr/local/Plone/Python-2.6/bin/python zodbconvert.py fstodb.conf

,以使用Plone正在运行的版本。

我遇到的错误是:

Traceback (most recent call last):
  File "zodbconvert.py", line 22, in <module>
    from persistent.TimeStamp import TimeStamp
ImportError: No module named persistent.TimeStamp

版本信息:

  • Plone 4.0.5(Python 2.6)
  • Postgresql 9.0.3
  • FreeBSD 8.1
  • python26-2.6.6_1
  • python27-2.7.1_1

顺便说一下,默认情况下“python --version”显示的是2.7.1

谢谢。

Nikolaj G.

3 个回答

0

快速解决方法..

locate persistent
export PYTHONPATH=$PYTHONPATH:/path/to/your/python_persistent_dir
0

你的Python安装中没有包含ZODB这个包。你可以调整一下PYTHONPATH,让它包含ZODB包,或者直接用easy_install ZODB来安装它,这要看你想做什么了。

5

如果你在使用 buildout(我希望你在用),那么最简单的方法就是让 buildout 为你创建一个脚本,这样就能把所有的 zodbconvert 依赖项正确地放到 Python 的路径里:

[buildout]
...
parts =
     ...
     zodbconvert

[zodbconvert]
recipe = zc.recipe.egg
eggs = ${buildout:eggs}
scripts = zodbconvert

这样,Buildout 会为你创建一个新的 bin/zodbconvert 脚本,这个脚本会把所有的 buildout 包都放到 sys.path 里。

另外,你也可以创建一个通用的 Python 脚本运行器,它会把你 buildout 中的所有包都包含进去,并且可以运行任意的脚本;你可以用这个来代替普通的 Python 解释器,这样就能用所有的 buildout 包来运行任意的 Python 脚本:

[buildout]
...
parts =
    ...
    zopepy

[zopepy]
recipe = zc.recipe.egg
eggs = ${buildout:eggs}
interpreter = zopepy
scripts = zopepy

然后你可以用 bin/zopepy 脚本来运行任意的 Python 脚本,因为所有的 buildout 包已经在 sys.path 里了,所以 bin/zopepy zodbconvert.py fstodb.conf 应该可以正常工作。

需要注意的是,Plone 的统一安装程序已经包含了 zopepy 部分,而我选择这个脚本的名字也是故意和它相同。

如果你没有使用 buildout(而且在 Plone 4 中,这通常不是个好主意),你也可以在你的 PYTHONPATH 环境变量中列出所需的包(ZODB3、zope.interface、RelStorage、psycopg2)。

撰写回答