Python Can';除非I';我正在使用一个交互式shell
在交互式shell上使用Python时,我能够毫无问题地导入cx_Oracle文件。例:Python Can';除非I';我正在使用一个交互式shell,python,cx-oracle,Python,Cx Oracle,在交互式shell上使用Python时,我能够毫无问题地导入cx_Oracle文件。例: me@server~/ $ python Python 2.7.6 (default, Mar 22 2014, 22:59:56) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import cx_Oracle >>>
me@server~/ $ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>>
如您所见,导入工作没有任何障碍。但是,当我尝试运行Python脚本执行相同的操作时,我得到一个错误:
me@server~/ $ sudo script.py
Traceback (most recent call last):
File "/usr/local/bin/script.py", line 19, in <module>
import cx_Oracle
ImportError: No module named "cx_Oracle'
我在这里感到困惑。其他相关信息是我运行的服务器是Ubuntu 14.04.1 LTS(从12.04升级)64位whichpython
和sudo which python
都指向相同的位置。同样,通过sudosu-
以root用户身份执行此操作也会得到相同的结果;从interactive导入OK,但从脚本导入错误
在这段时间内,除了操作系统升级之外,什么都没有发生。sudo启动了一个新的bash环境,然后指向一个不同的python可执行文件(不同的安装模块) 您可以使用
which python
和sudo which python
编辑:因此,如果它们指向同一个可执行文件,那么您应该查看sys.path以查找差异。在这两种环境中,您都可以:
python -c "import sys; print('\n'.join(sys.path))"
sudo python -c "import sys; print('\n'.join(sys.path))"
寻找差异。如果没有:
在这种导入情况下,一个常见的错误是python将首先查看本地目录。因此,如果您碰巧正在运行python并导入在本地找到的内容(例如,cx_Oracle是您当前位置的子目录),那么如果更改目录,您将收到一个导入错误
最后一点注意:这里我假设script.py的shbang指向与
哪个python
相同的可执行文件。也就是说,pythonscript.py
和script.py
返回相同的错误。对不起,所有的。这对我来说是个愚蠢的决定。事实证明,所讨论的脚本使用的是Python3,当服务器升级时,Python3从3.2版本变成了3.4版本
在3.4版本中设置cx_Oracle模块后,一切都按预期运行
菲尔,你最后一句话是关于舍邦的,正是这句话让我发现了这一点,你真是太好了!我之所以没有把你的回答记为答案,是因为从技术上讲,这并不是答案,而是引导我走上了正确的道路
干杯 菲尔,谢谢你
whichpython
和sudowhichpython
都指向同一个可执行文件。我会用这些信息修改我的帖子。将来,如果有人在对你的错误给出了多个建议后(免费)引导你找到解决方案,请向上投票,并在“谢谢”评论或原始问题中发布解决方案。不是在你自己的答案中,这不会给问题带来进一步的见解。提示:你的第一个被接受的答案(我想不是你自己的答案)会得到一枚徽章。菲尔,我试着投你的赞成票,但缺乏声誉。现在更便宜了,谢谢我只能做系统允许的事,没有侮辱的意思。好吧。
python -c "import sys; print('\n'.join(sys.path))"
sudo python -c "import sys; print('\n'.join(sys.path))"