我正在为要安装在异构资源集上的 python 模块配置基于 distutils 的 setup.py。由于异质性,模块的安装位置在每台主机上并不相同,但 disutils 会选择特定于主机的位置。
我发现使用 disutils 安装模块时没有 o+rx 权限(尽管在运行 setup.py 之前设置了 umask)。一种解决方案是手动更正此问题,但是我想要一种适用于异构安装目标的自动化方法。
例如,有没有办法从 setup.py 中提取安装的结束位置?
还有其他建议吗?
我正在为要安装在异构资源集上的 python 模块配置基于 distutils 的 setup.py。由于异质性,模块的安装位置在每台主机上并不相同,但 disutils 会选择特定于主机的位置。
我发现使用 disutils 安装模块时没有 o+rx 权限(尽管在运行 setup.py 之前设置了 umask)。一种解决方案是手动更正此问题,但是我想要一种适用于异构安装目标的自动化方法。
例如,有没有办法从 setup.py 中提取安装的结束位置?
还有其他建议吗?
我发现使用 disutils 安装模块时没有 o+rx 权限
我现在不记得 distutils 是否按原样复制具有其权限的文件,或者它是否只是复制内容。
(尽管在运行 setup.py 之前设置了 umask)
我不确定从 Python 复制的 umask 和文件应该如何交互;umask 适用于系统调用还是需要 Python 代码明确注意?
例如,有没有办法从 setup.py 中提取安装的结束位置?
有一个,有点绕。你会用这些信息做什么?
os.path.dirname(__file__) 可能是您正在寻找的。模块中的 __file__ 返回加载模块的路径。
假设你的模块是一个包含 Something.py 的文件夹,在 setup.py 中:
import os
#setup(...) call here
from yourmodule import Something
print os.path.dirname(Something.__file__)
唯一的问题是,如果您的文件结构中您的模块与 setuputils 位于同一目录中。在这种情况下,python 加载器会优先从当前目录加载 yourmodule.Something。
两个有点骇人听闻但有效的颠覆选项可能是
从 python 路径中删除当前目录,强制它从现在存在于站点包中的文件中加载:
导入系统 sys.path = sys.path[1:]
在导入语句之前临时重命名 yourmodule 文件夹。
使用选项 1,整个事情是:
import os
import sys
#setup(...) call here
#Remove first entry in sys.path which is current folder (probably impl dependent, but for practical purposes is consistent)
sys.path = sys.path[1:]
from yourmodule import Something
print os.path.dirname(Something.__file__)
我刚刚用我的 setup.py 之一对此进行了测试,效果很好。祝你好运!
我对 disutils 不是很了解,但我猜如果您深入研究它直到找到写入文件的位置,那么您将在该行看到路径变量。
此页面可能对您有所帮助