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

时间:2014-08-23 22:21:22

标签: python scripting permissions setuptools

我有一个我已创建的Python包,并且我使用setuptools.setup()来安装它。该软件包包含可执行脚本,使用scripts函数的setup()参数。

我这样安装:

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 group = root)。所有可执行脚本在开发区域中都具有-rwxr-xr-x权限。

1 个答案:

答案 0 :(得分:7)

这个问题现在有点老了,但我希望我的答案对于碰巧像我一样找到它的人都会有用。

我的包裹遇到了同样的问题。显然,setuptools和pip(我的pip都是1.5.6)都没有明确处理权限。您可以选择手动更改权限,也可以从scripts参数迁移到entry_points

1)手动更改文件权限

这很棘手且足够克服,但应该有效。我们的想法是,如果安装过程将您的可执行文件放到/usr/local/bin,它还有权限chmod文件以包含可执行标志。从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为setup()名为entry_points的{​​{1}}提供了一个选项。它接受包含密钥console_scriptsgui_scripts的字典,您可以按如下方式使用:

setup(
    # Package name, version, author, links, classifiers, etc
    entry_points = {
        'console_scripts': [
            'myexecfile = mypackage.mymainmodule:mymainfunction'
        ]
    }
)

此语句会自动生成myexecfile可执行文件,该mymainfunction来自mymainmodule mypackage mymainfunctionsys.argv可以很容易地成为您正在分发的软件包。

您应该知道的问题是入口点函数(在此示例中为sys.argv)可能没有任何参数。如果您从可执行文件中将select count(distinct(a.mat)),count(distinct(c.mail)) as nb from aca as a left join c on c.mat=a.mat group by a.mat having nb > 0 order by nb desc 作为参数传递给main函数,则应该重写函数以自行检索和解析namespace ApiMaps\ApiMapBundle\Controller; class GetApiController extends Controller { public function getapiAction() { ----gettting data from api ----save it in data base return new Response();

Chris Warrick写了一篇关于这个名为Python Apps The Right Way的功能的好文章,你可能会发现它很有用。