2013-04-23 63 views
0

我在运行脚本时遇到了一个奇怪的问题,我无法加载pymongo,但在运行hashbang解释器(/usr/bin/env python)时它可用。模块可以在控制台中导入,但不能在脚本中导入

原来的电话号码import pymongo被深埋在一个班级里,但即使我在第一行叫它,它也会失败。

这是为什么?

下面是从表示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 
+0

python在'sys.path'列出的地方查找模块。也许比较这个变量对两种情况都有帮助。 – 2013-04-23 19:52:36

+1

可能脚本修改了'sys.path'? – mata 2013-04-23 19:52:51

+2

你很可能在你的计算机上安装了多个python版本。 python中你所说的“original”的路径可能与hashbang enterpreter所具有的python不同。 – 2013-04-23 19:54:58

回答

0

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

我假设你正在尝试像你一样运行脚本,也就是启动交互式解释器的用户。如果不是,那么这也可能是一个原因。

+0

感谢您的回答。我更新了原始文章,显示当我运行'/ usr/bin/env python'时,'pymongo'可用。这让我觉得很奇怪,但这表明我可能不会理解'env'。 – mbrownnyc 2013-04-23 20:10:54

0

跑步/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。好吧...

+0

我真的不明白这一点;你是说在你的终端上运行'/ usr/bin/env python'运行一个不同的Python可执行文件来在你的终端上运行'python'?这令我感到惊讶。 – 2016-12-24 20:15:54

0

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

相关问题