从 xcode 宏运行 python 脚本时如何使用我的标准 python 路径

问题描述 投票:0回答:7

我正在尝试使用 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 。有人知道这条路从哪里来吗?

python xcode macos path
7个回答
4
投票

在 Mac 上,.profile 中的环境变量对终端外部的应用程序不可见。

如果您希望 Xcode 应用程序可以使用环境变量(如 PATH、PYTHONPATH 等),则应将其添加到在 ~/.MacOSX/environment.plist 创建的新 plist 文件中。

请参阅苹果开发者网站上的 EnvironmentVars 文档了解更多详细信息。


1
投票

一个快速但黑客的方法是为 python 提供一个包装脚本。

cat > $HOME/bin/mypython << EOF
#!/usr/bin/python
import os
os.path = ['/list/of/paths/you/want']
EOF

然后使用

启动所有 XCode 脚本
#!/Users/you/bin/mypython

1
投票

只需将路径添加到 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
>>> 

1
投票

我倾向于使用 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


0
投票

如果我的回答看起来很无知,请原谅我,我对Mac并不完全熟悉,而且我也可能误解了你的问题。

在 Windows 和 Linux 上,当我想引用我编写的脚本时,我设置 PYTHONPATH 环境变量。如果我没记错的话,这就是 os.sys.path 从中获取值的地方。

假设 myScript.py 位于 /Somewhere 中。将 PYTHONPATH 设置为:

PYTHONPATH = /Somewhere

现在您应该能够“导入 myScript”。

如果您开始将子文件夹作为 python 包进行处理,请研究每个文件夹中 init.py 文件的用法。

如果您计划一直重复使用此脚本和其他脚本,则应将 PYTHONPATH 设置为环境变量。


0
投票

不确定 Xcode 是否算作通过 Finder 启动脚本,但如果是的话,显然 Finder 在为用户启动时不会像终端那样读取

.profile
.cshrc
文件。

如果您的问题仍未得到解答,请查看 Apple 的知识库:QA1067 并使用

plist
设置您的环境。


0
投票

自从这个问题首次发布以来的十五年里,Xcode 发生了很大的变化……而且这个问题仍然存在。今天,我通过在 xcode 脚本框中获取我常用的 .bash_profile 来解决。

. ~/.bash_profile # we need our standard setup.

screenshot from xcode

© www.soinside.com 2019 - 2024. All rights reserved.