2013-04-23 64 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,所以當我嘗試導入串行它無法識別我的包。我只是重命名我的文件,並正常工作。

相關問題