如何使用Python Setuptools指定脚本的执行权限
我创建了一个Python包,并使用setuptools.setup()
来安装它。这个包里包含了一些可执行的脚本,我是通过setup()
函数里的scripts
参数来处理这些脚本的。
我这样进行安装:
sudo python setup.py install
安装完成后,这些可执行脚本会放在/usr/local/bin
目录下。唯一的问题是,它们的权限设置是:
-rwxr-x--- 1 root root 57 Aug 23 15:13 example_script*
而不是:
-rwxr-xr-x 1 root root 57 Aug 23 15:13 example_script*
有没有人知道我怎么能指定输出的可执行文件的权限,或者为什么默认的权限设置不允许任何人执行这些文件呢?
顺便说一下:我的umask是0027
,而/usr/local/bin/
的权限是drwxr-xr-x
(所有者是root,组也是root)。在开发环境中,所有可执行脚本的权限都是-rwxr-xr-x
。
1 个回答
这个问题现在有点老了,但我希望我的回答能对偶然看到它的人有帮助,就像我当初一样。
我在我的包中也遇到了同样的问题。显然,setuptools和pip(我的pip版本是1.5.6
)并没有明确处理权限。你可以选择手动更改权限,或者从scripts
参数迁移到entry_points
。
1) 手动更改文件权限
这有点麻烦,但应该能解决问题。基本思路是,如果安装过程把你的可执行文件放到/usr/local/bin
,那么它也有权限将文件的权限更改为可执行。你可以在setup.py
文件中,在setup()
语句之后,运行类似下面的代码:
execpath = '/usr/local/bin/yourexec'
if os.name is 'posix' and os.path.exists(execpath):
os.chmod(execpath, int('755', 8))
2) 迁移到 entry_points
setuptools提供了一个名为entry_points
的选项,可以在你的setup()
中使用。它接受一个字典,字典的键是console_scripts
和gui_scripts
,你可以这样使用:
setup(
# Package name, version, author, links, classifiers, etc
entry_points = {
'console_scripts': [
'myexecfile = mypackage.mymainmodule:mymainfunction'
]
}
)
这个语句会自动生成一个名为myexecfile
的可执行文件,它会调用mypackage
中的mymainfunction
,这很可能就是你要分发的包。
需要注意的是,入口点函数(在这个例子中是mymainfunction
)不能有任何参数。如果你想把sys.argv
作为参数传递给你的主函数,你需要重新编写这个函数,让它自己获取和解析sys.argv
。
Chris Warrick写了一篇关于这个功能的好文章,叫做Python Apps The Right Way,你可能会觉得很有用。