我刚开始使用Python并需要一些指导。
我正在使用Mac,但我安装了python.org版本的python以及最初的Apple安装。
我正在尝试加载一些第三方模块。当我在IDLE或终端中运行脚本时,一切正常。当我尝试将其作为CRON作业运行时,我收到错误消息,说它无法找到第三方模块。
经过一番探索之后,我一直认为这是PYTHONPATH / sys.path。我创建了一个测试脚本来向我展示我的路径。那么,为什么我在通过终端窗口而不是直接作为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']
这是我在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']"
答案 0 :(得分:4)
为什么他们不同?
因为您正在运行两个不同的Python解释器,并且它们具有不同的默认sys.path
值。
这是故意的 - 它允许您修改Python.org安装的标准(或站点)库,而不会破坏系统安装(或任何依赖于该安装的Apple提供的工具)。
我猜测,当您在终端中运行python
时,您将获得/usr/local/bin/python
(您可以通过键入which python
来检查),这可能是/Library/Frameworks/Python.framework/Versions/7.3/bin/python
的链接{1}}(或者可能是该框架内某处的Python.app/Contents/MacOS/python
)。来自python.org的Python被编译为围绕/Library/Frameworks/Python.framework/Versions/7.3 /.
sys.path
同时,当您通过启动服务运行python
时,您可能会获得/usr/bin/python
,这是(希望)/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python
内置的垫片,它被编译为设置在sys.path
附近/System/Library/Frameworks/Python.framework/Versions/2.7/
。
python
在这些情况下执行不同操作的原因是/usr/local/bin
根本不在您的登录PATH
上,而是通过您的行中的一行添加到路径的头部~/.profile
(或其他)文件。该文件由终端中的shell会话读取,但不是由Launch Services会话读取。
如果您想在所有环境中使用相同的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 build。
或者,更简单地说,卸载它并将其卸载,只需使用内置的Python 2.7。如果您需要多个环境,请使用virtualenv
而不是多个安装。例如,如果Apple给你2.7.2并且你真的需要2.7.3,那么你需要另一个装置;否则,你只是让事情变得更难,没有任何好处。