除非我使用交互式shell,否则无法导入cx_Oracle模块

时间:2015-01-05 14:22:14

标签: 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
>>> 

正如您所看到的,导入工作毫不费力。但是,当我尝试运行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'

以下是script.py的重要部分:

# 16 other lines above here
# Imports
import sys
import cx_Oracle
import psycopg2
...

我在这迷糊糊糊。其他相关信息是我运行的服务器是Ubuntu 14.04.1 LTS(从12.04升级)64位。 which pythonsudo which python都指向同一位置。此外,通过sudo su -以root身份执行此操作会得到相同的结果;从交互式导入OK但从脚本导入错误。

除了操作系统升级之外,在其工作和停止工作之间都没有发生。

2 个答案:

答案 0 :(得分:1)

对不起,全部。这对我来说太愚蠢了。原来这个脚本使用的是Python3,当服务器升级时,Python3从3.2版本变为3.4版本。

一旦在3.4版本中设置了cx_Oracle模块,一切都按预期工作。

菲尔,你最后一个关于shebang的笔记是让我发现这一点的原因,所以对你有所了解!我没有将你的回答标记为答案的原因是因为从技术上说它不是,而是让我走上了正确的道路。

干杯!

答案 1 :(得分:0)

sudo启动一个新的bash环境,然后指向另一个python可执行文件(不同的已安装模块)。

您可以使用which pythonsudo 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指向与which python相同的可执行文件。也就是说,python script.pyscript.py会返回相同的错误。