Python模块在终端中导入,但不是通过Unix Shell导入

use*_*887 5 python terminal pythonpath

我刚开始使用Python并需要一些指导.

我正在使用Mac,但我安装了python.org版本的python以及最初的Apple安装.

我正在尝试加载一些第三方模块.当我在IDLE或终端中运行脚本时,一切正常.当我尝试将其作为CRON作业运行时,我收到错误消息,说它无法找到第三方模块.

经过一番探讨之后,我一直认为这是PYTHONPATH/sys.path.我创建了一个测试脚本来向我展示我的路径.那么,为什么我在通过终端窗口而不是直接作为shell脚本时获得不同的路径?

我的两个问题是:

  1. 他们为什么不同?
  2. 如何获得直接shell进程来查找第三方模块?

这是我在终端中运行时的sys.path输出:

['/Library/Scripts',
 '/Library/Scripts/$',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip',
 '/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7',
 '/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-darwin',
 '/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac',
 '/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-tk',
 '/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-old',
 '/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-dynload',
 '/Library/Python/2.7/site-packages']
Run Code Online (Sandbox Code Playgroud)

这是我在shell中运行它时的sys.path输出(在这种情况下,我在Applescript中使用"do shell script"步骤.

"['/Library/Scripts',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Library/Python/2.7/site-packages']"
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 4

\n

为什么它们不同?

\n
\n\n

因为你正在运行两个不同的Python解释器,并且它们有不同的默认值sys.path值。

\n\n

这是故意的\xe2\x80\x94,它允许您修改 Python.org 安装的标准(或站点)库,而不会破坏系统安装(或依赖于该安装的任何 Apple 提供的工具)。

\n\n

我猜当您python在终端中运行时,您会得到/usr/local/bin/python(您可以通过输入来检查),这可能是到(或可能到该框架内的某个位置)which python的链接。来自 python.org 的 Python 被编译以设置/Library/Frameworks/Python.framework/Versions/7.3/bin/pythonPython.app/Contents/MacOS/pythonsys.path围绕 /Library/Frameworks/Python.framework/Versions/7.3/ 设置。

\n\n

同时,当您python通过 Launch Services 运行时,您可能会得到/usr/bin/python,这是(希望)周围的内置填充程序/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python,它被编译以设置sys.path ,它被编译为围绕/System/Library/Frameworks/Python.framework/Versions/2.7/

\n\n

python在这些情况下执行不同操作的原因是根本/usr/local/bin不在您的登录名上PATH,而是通过您的路径中的一行添加到路径的开头~/.profile。该文件由终端中的 shell 会话读取,但不由启动服务会话读取。

\n\n

如果您想在所有环境中使用相同的 Python,您可以显式运行/usr/local/bin/pythonor/usr/bin/python而不仅仅是python. (您也可以进入/usr/local/bin您的登录路径,但这是一个非常糟糕的主意,或者将其从您的~/.profile,但这有点不方便。)

\n\n

附带说明一下,这表明您的 python.org 安装非常损坏:

\n\n
/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip\n
Run Code Online (Sandbox Code Playgroud)\n\n

没有 Python 7.3。我强烈考虑卸载并重新安装 python.org 版本。

\n\n

或者,更简单地说,卸载它并保持卸载状态,然后仅使用内置的 Python 2.7。如果您想要多个环境,请使用virtualenv而不是多个安装。例如,如果 Apple 为您提供 2.7.2,而您确实需要 2.7.3,那么您需要再次安装;否则,你只会让事情变得更加困难,而没有任何好处。

\n