【问题标题】:Unable to use installed module in script无法在脚本中使用已安装的模块
【发布时间】:2014-10-07 13:38:41
【问题描述】:

我是 python 的新手(大约一周),所以也许我只是错过了一些明显的东西......

我无法在脚本code.py 中导入和使用模块。该模块是使用easy_install 安装的,名为googlemaps。我使用以下命令(成功)安装了它:

sudo easy_install googlemaps

当我尝试从 Python 解释器导入模块时,它似乎工作正常:

>>> googlemaps
<module 'googlemaps' from '/usr/local/lib/python2.7/dist-packages/googlemaps-1.0.2-py2.7.egg/googlemaps.pyc'>

但是,当我尝试在脚本中执行相同操作时,它会给出以下回溯:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/web/application.py", line 239, in process
    return self.handle()
  File "/usr/local/lib/python2.7/dist-packages/web/application.py", line 230, in handle
    return self._delegate(fn, self.fvars, args)
  File "/usr/local/lib/python2.7/dist-packages/web/application.py", line 420, in _delegate
    return handle_class(cls)
  File "/usr/local/lib/python2.7/dist-packages/web/application.py", line 396, in handle_class
    return tocall(*args)
  File "/var/www/example.com/application/code.py", line 57, in GET
    self.generate_map()
  File "/var/www/example.com/application/code.py", line 64, in generate_map
    from googlemaps import GoogleMaps
  ImportError: No module named googlemaps

我怀疑这是某种路径问题,但我不完全理解为什么或如何解决它。如果我从解释器发出以下内容:

>>> import sys
>>> sys.path
['', '/usr/local/lib/python2.7/dist-packages/googlemaps-1.0.2-py2.7.egg', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

一切看起来都很好,但是如果我从脚本中执行相同的操作,结果会丢失 google-maps-1.0.2-py2.7.egg 条目:

['/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

从脚本中使用时是否必须手动添加路径,或者我在这里缺少什么???我安装的其他模块没有这个问题。

【问题讨论】:

  • 如果您使用的是 mod_wsgi,您可能需要重新加载服务器。
  • 啊哈!这实际上起到了作用。那么是否需要更新 apache 用户的 PYTHONPATH 之类的东西?
  • 不,只是它没有“即时”读取更改。
  • 好的。好吧,如果您想将您的评论转换为答案,我会将其设为已接受的。或者,如果您愿意,我可以写一个答案。
  • 您可以自己回答,然后接受您的回答。

标签: python easy-install


【解决方案1】:

在使用模块中的函数之前,您必须使用以下方式导入它:

import googlemaps

将模块 googlemaps 中的函数用作 googlemaps.FUNC_NAME()

import googlemaps as gmaps

将模块 googlemaps 中的函数用作 gmaps.FUNC_NAME()

from googlemaps import *

导入整个命名空间并直接使用函数作为 FUNC_NAME()。小心使用此选项遮盖其他现有名称。

有关 Python 模块的进一步参考,请参阅 https://docs.python.org/2/tutorial/modules.html

【讨论】:

  • 感谢您的回答,但 Burhan 的建议确实对我有用。
【解决方案2】:

这似乎对我有用,但你应该尝试这样的事情:-

import googlemaps
from googlemaps import GoogleMaps

【讨论】:

  • 感谢您的回答,但 Burhan 的建议确实对我有用。
【解决方案3】:

是的,您需要附加 sys.path 以包含所需的路径。你在解释器和脚本中有不同的 sys.path 真的很奇怪,但我无法帮助你,因为我几乎不知道如何在 Windows 上处理它,而且我是一个陌生人到 Linux。

所以是的,继续:

import sys
sys.path.appen(r"/usr/local/lib/python2.7/dist-packages/googlemaps-1.0.2-py2.7.egg")

在导入 googlemaps 之前,您可以解决问题,即使它很混乱,而且肯定有更好的解决方案。尽管如此,它仍然有效,您可以立即实施。

【讨论】:

    【解决方案4】:

    根据 Burhan Khalid 的建议,我的问题与脚本 code.py 正在由使用 mod_wsgi 模块的 apache 网络服务器运行这一事实有关。它显然在运行之后才合并对 sys.path 的更改:

    sudo service apache2 reload
    

    如果你正在使用mod_wsgi并且有类似的问题,试试吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2021-11-12
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多