我正在尝试使用 Xcode 的用户脚本菜单运行 Python 脚本。
我遇到的问题是,当从 XCode 运行脚本时,我通常的 os.sys.path (取自 ~/.profile)似乎没有被导入,就像在终端(或使用 IPython)运行脚本一样。我得到的只是默认路径,这意味着我不能做类似的事情
#!/usr/bin/python
import myScript
myScript.foo()
其中 myScript 是我添加到路径中的文件夹中的模块。
我可以很容易地手动将特定路径附加到 os.sys.path ,但我必须在每个脚本中为我想要使用模块的每个路径执行此操作
有没有办法进行设置,使其使用与我在其他地方使用的路径相同的路径?
编辑:进一步研究后,似乎从 Xcode 执行的脚本使用了与正常情况完全不同的路径。我在Xcode中运行脚本得到的路径是:
PATH=/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
我确信我的常规路径中没有 /Developer/usr/bin 。有人知道这条路从哪里来吗?
在 Mac 上,.profile 中的环境变量对终端外部的应用程序不可见。
如果您希望 Xcode 应用程序可以使用环境变量(如 PATH、PYTHONPATH 等),则应将其添加到在 ~/.MacOSX/environment.plist 创建的新 plist 文件中。
请参阅苹果开发者网站上的 EnvironmentVars 文档了解更多详细信息。
一个快速但黑客的方法是为 python 提供一个包装脚本。
cat > $HOME/bin/mypython << EOF
#!/usr/bin/python
import os
os.path = ['/list/of/paths/you/want']
EOF
然后使用
启动所有 XCode 脚本#!/Users/you/bin/mypython
只需将路径添加到 sys,path 即可。
>>> import sys
>>> sys.path
['', ... lots of stuff deleted....]
>>> for i in sys.path:
... print i
...
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python25.zip
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-mac/lib-scriptpackages
/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload
/Library/Python/2.5/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/PyObjC
>>> sys.path.append("/Users/crm/lib")
>>> for i in sys.path:
... print i
...
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python25.zip
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-mac/lib-scriptpackages
/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload
/Library/Python/2.5/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/PyObjC
/Users/crm/lib
>>>
我倾向于使用 pth 文件。 来自文档。
最方便的方法是添加 将配置文件路径指向目录 这已经在Python的路径上了, 通常到.../site-packages/ 目录。路径配置文件 具有 .pth 扩展名,并且每个 行必须包含一个路径 将被附加到 sys.path。 (因为 新路径被附加到 sys.path,模块中添加 目录不会覆盖标准 模块。这意味着你不能使用这个 安装固定机构 标准模块的版本。)
所以最简单的事情就是执行以下操作:
echo "/some/path/I/want/to/add" > /Library/Python/2.5/site-packages/custom.pth
HTH
如果我的回答看起来很无知,请原谅我,我对Mac并不完全熟悉,而且我也可能误解了你的问题。
在 Windows 和 Linux 上,当我想引用我编写的脚本时,我设置 PYTHONPATH 环境变量。如果我没记错的话,这就是 os.sys.path 从中获取值的地方。
假设 myScript.py 位于 /Somewhere 中。将 PYTHONPATH 设置为:
PYTHONPATH = /Somewhere
现在您应该能够“导入 myScript”。
如果您开始将子文件夹作为 python 包进行处理,请研究每个文件夹中 init.py 文件的用法。
如果您计划一直重复使用此脚本和其他脚本,则应将 PYTHONPATH 设置为环境变量。
不确定 Xcode 是否算作通过 Finder 启动脚本,但如果是的话,显然 Finder 在为用户启动时不会像终端那样读取
.profile
或 .cshrc
文件。
如果您的问题仍未得到解答,请查看 Apple 的知识库:QA1067 并使用
plist
设置您的环境。