【问题标题】:Python Module imports in Terminal but not through Unix Shell在终端中导入 Python 模块,但不通过 Unix Shell
【发布时间】:2012-10-22 23:59:26
【问题描述】:

我刚刚开始使用 Python,需要一些指导。

我使用的是 Mac,但我安装了 python.org 版本的 python 以及原始的 Apple 安装。

我正在尝试加载一些第 3 方模块。当我在 IDLE 中或通过终端运行脚本时,一切正常。当我尝试将其作为 CRON 作业运行时,我收到一条错误消息,提示它找不到 3rd 方模块。

经过一番摸索,我被引导相信它是 PYTHONPATH / sys.path。我创建了一个测试脚本来向我展示我的路径。那么,为什么当它通过终端窗口运行而不是直接作为 shell 脚本运行时,我会得到不同的路径呢?

我的两个问题是:

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

这是我在终端中运行时的 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']

这是我在 shell 中运行时的 sys.path 输出(在这种情况下,我在 Applescript 中使用“执行 shell 脚本”步骤。

"['/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']"

【问题讨论】:

  • 你一定要看看 virtualenv;它将帮助您处理不同版本的 python 和特定于项目的路径变量。

标签: python terminal pythonpath


【解决方案1】:

它们为什么不同?

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

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

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

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

python 在这些情况下做不同事情的原因是 /usr/local/bin 根本不在您的登录 PATH 上,而是通过您的 ~/.profile (或其他) 文件。该文件由终端中的 shell 会话读取,但不是由启动服务会话读取。

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

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

/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip

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

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

【讨论】:

  • 顺便说一句,我相信上面的 7.3 框架版本来自 Enthought Python OS X 发行版,而不是损坏的安装。他们使用自己的框架版本方案与 python.org Python 共存。
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2021-08-13
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多