设置Python模块的权限(python setup install)

1 投票
3 回答
1833 浏览
提问于 2025-04-15 22:16

我正在为一个Python模块配置一个基于distutils的setup.py,这个模块要安装在不同类型的资源上。由于这些资源的不同,模块安装的位置在每个主机上都不一样,但disutils会选择特定于主机的位置。

我发现使用disutils安装模块时,权限设置为没有o+rx权限(尽管我在运行setup.py之前已经设置了umask)。一个解决办法是手动修正这个问题,但我希望能有一种自动化的方法,适用于不同的安装目标。

比如,有没有办法在setup.py中提取安装的最终位置?

还有其他建议吗?

3 个回答

0

我发现这个模块在用disutils安装时,没有o+rx的权限。

我现在不太记得distutils是直接复制文件的权限,还是只复制文件的内容。

(尽管在运行setup.py之前设置了umask)

我不太确定umask和Python中的文件复制是怎么互动的;umask是应用于系统调用的,还是需要Python代码特别去注意?

比如,有没有办法在setup.py里面提取安装的最终位置?

有一种方法,不过有点复杂。你打算用这些信息做什么呢?

0

我对disutils不是很了解,但我猜如果你仔细找找,直到找到你的文件被写入的地方,你就会看到那一行的路径变量。

这个页面可能对你有帮助。

0

你可以试试使用 os.path.dirname(__file__)。在一个模块中,__file__ 会返回这个模块被加载时的路径。

假设你的模块文件夹叫 yourmodule,里面有一个文件叫 Something.py,在 setup.py 里可以这样写:

import os
#setup(...) call here
from yourmodule import Something
print os.path.dirname(Something.__file__)

不过有个小问题,如果你的文件结构是 yourmodule 和 setuputils 在同一个目录下,那么 Python 会优先从当前目录加载 yourmodule.Something。

有两种稍微有点小技巧但有效的方法可以解决这个问题:

  1. 把当前目录从 Python 的路径中移除,这样它就会从 site-packages 中加载文件:

    import sys sys.path = sys.path[1:]

  2. 在导入语句之前,临时重命名 yourmodule 文件夹。

如果选择第一种方法,整个代码是:

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 测试过这个,效果很好。祝你好运!

撰写回答