模块可以在控制台导入,但不能在脚本中导入

Posted

技术标签:

【中文标题】模块可以在控制台导入,但不能在脚本中导入【英文标题】:Module can import at console, but not within script 【发布时间】:2013-04-17 04:11:37 【问题描述】:

我在运行脚本时遇到了一个奇怪的问题,我无法加载pymongo,但是当我运行 hashbang 解释器 (/usr/bin/env python) 时它是可用的。

最初的调用 import pymongo 被埋在一个类的深处,但即使我在第 1 行调用它,它也失败了。

这是为什么?

以下是 python 控制台的一些输出,显示 pymongo 可用:

# /usr/bin/env python
Python 2.7.4 (default, Apr 23 2013, 14:02:51)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
>>> 

这是脚本的前三行

# head -n 3 ./app/app.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymongo

这是失败的:

# python ./app/app.py
Traceback (most recent call last):
  File "./app/app.py", line 3, in <module>
    import pymongo
ImportError: No module named pymongo

但是使用/usr/bin/env 运行正常...为什么?

# /usr/bin/env python ./app/app.py
Traceback (most recent call last):
  File "./app/app.py", line 37, in <module>
    db = backend.flowbackend.getBackendObject(config.db_backend, config.db_host, config.db_port, config.db_user, config.db_password, config.db_name)
      File "./app/../lib/backend/flowbackend.py", line 268, in getBackendObject
    return MongoBackend(host, port, user, password, databaseName)
  File "./app/../lib/backend/mongobackend.py", line 13, in __init__
    self.connect()
  File "./app/../lib/backend/mongobackend.py", line 62, in connect
    self.conn = pymongo.Connection(self.host, self.port)
  File "/usr/local/lib/python2.7/site-packages/pymongo/connection.py", line 220, in     __init__
    max_pool_size, document_class, tz_aware, _connect, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 336, in     __init__
    raise ConnectionFailure(str(e))
pymongo.errors.ConnectionFailure: could not connect to 127.0.0.1:27017: [Errno 111]     Connection refused

【问题讨论】:

python 在sys.path 中列出的位置查找模块。也许在这两种情况下比较这个变量会有所帮助。 可能脚本修改了sys.path? 您的计算机上很可能安装了多个版本的 python。您所说的“原始”中的 python 路径可能与 hashbang enterpreter 所具有的 python 不同。 我添加了一些输出来解决你们三个提出的话题。 看起来mata 是正确的。 【参考方案1】:

我对 pyserial 也有同样的问题,但在我的情况下,我的脚本文件名为 serial.py,所以当我尝试导入 serial 时,它无法识别我的包。我只是重命名了我的文件并且工作正常。

【讨论】:

【参考方案2】:

运行 /usr/bin/python 是 2.6.6,/usr/local/bin/python 是 2.7.4。 pip-python 正在影响 /usr/bin/python

# pip-python -E /usr/local/bin/python freeze
distribute==0.6.10
iniparse==0.3.1
pycurl==7.19.0
pygpgme==0.1
urlgrabber==3.9.1
wsgiref==0.1.2
yum-metadata-parser==1.1.2

# pip-python install pymongo
...

# pip-python -E /usr/local/bin/python freeze
distribute==0.6.10
iniparse==0.3.1
pycurl==7.19.0
pygpgme==0.1
pymongo==2.5
urlgrabber==3.9.1
wsgiref==0.1.2
yum-metadata-parser==1.1.2

# pip-python -E /usr/bin/python freeze
distribute==0.6.10
iniparse==0.3.1
pycurl==7.19.0
pygpgme==0.1
pymongo==2.5
urlgrabber==3.9.1
yum-metadata-parser==1.1.2

两个实例必须引用相同的libs。好吧好吧……

【讨论】:

这个我不太明白;你是说在你的终端上运行/usr/bin/env python 与在你的终端上运行python 运行不同的Python 可执行文件吗?这让我很惊讶。【参考方案3】:

检查主目录中的 .pythonrc。控制台执行它(如果存在),脚本不执行。这是我现在唯一能想到的。也许它设置了 sys.path 以便 pymongo 可以访问。

我假设您正在尝试以您自己的身份运行脚本,即启动交互式解释器的同一用户。如果不是,那也可能是一个原因。

【讨论】:

感谢您的回答。我更新了原始帖子,显示当我运行/usr/bin/env python 时,pymongo 可用。这让我觉得很奇怪,但它表明我可能无法理解env

以上是关于模块可以在控制台导入,但不能在脚本中导入的主要内容,如果未能解决你的问题,请参考以下文章

我是否必须在powershell Runbook(azure)中导入模块?

能够导入模块但不能从中导入东西[关闭]

从命令行运行 python 要求我导入模块

Nextjs - 动态导入 - CSS 模块不能从 node_modules 中导入

在 ES 模块(Node.js)中导入 JSON 文件

无法在 .tsx 文件中导入 CSS 模块