如何使用Python Setuptools指定脚本的执行权限

7 投票
1 回答
1742 浏览
提问于 2025-04-18 18:18

我创建了一个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 个回答

8

这个问题现在有点老了,但我希望我的回答能对偶然看到它的人有帮助,就像我当初一样。

我在我的包中也遇到了同样的问题。显然,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_scriptsgui_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,你可能会觉得很有用。

撰写回答