Python 使用“setup.py”安装包后运行“chmod”`

Python 使用“setup.py”安装包后运行“chmod”`,python,virtualenv,distutils,distribute,setup.py,Python,Virtualenv,Distutils,Distribute,Setup.py,假设我有一个包,它调用代码中的某个可执行文件(例如第三方c/java程序)。让我们进一步假设,应用程序非常小/微不足道,足以与包捆绑在一起。例如,单个可执行文件(cfoo) 我可以继续,并将文件放入以下结构中: . |-- foo | |-- __init__.py | |-- __init__.pyc | |-- core.py | |-- corebin | | `-- cfoo | `-- foomain.py `-- setup.py 并准备一个setup.

假设我有一个包,它调用代码中的某个可执行文件(例如第三方c/java程序)。让我们进一步假设,应用程序非常小/微不足道,足以与包捆绑在一起。例如,单个可执行文件(
cfoo

我可以继续,并将文件放入以下结构中:

.
|-- foo
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- core.py
|   |-- corebin
|   |   `-- cfoo
|   `-- foomain.py
`-- setup.py
并准备一个
setup.py
,如下所示:

from setuptools import setup

setup(
    name='foo',
    version='1.0',
    packages=['foo'],
    scripts=['foo/foomain.py'],
    package_data={'foo': ['corebin/*']},
    zip_safe=False
)
这将允许我正确安装软件包。稍后,在包代码中,我可以执行以下操作:

from subprocess import call

import pkg_resources as res

def main():
    fn = res.resource_filename('foo', 'corebin/cfoo')
    print "Resource located at:", fn
    call([fn])
不幸的是,将在未设置可执行标志的情况下安装可执行文件。即使原始文件已设置。在
setup.py
脚本末尾添加
chmod
调用并不容易,因为首先需要找出正确的安装路径。我尝试了
resource\u filename
,但返回了本地文件(如“预安装”)


如何解决这个问题?同时,考虑到
virtualenv

我将我的评论升级为一个答案:


如果使用
scripts
关键字安装它,它将获得正确的模式(并安装在适当的bin/目录中)

安装后,如何对包中包含的文件执行某些操作


它似乎解决了同样的问题,而且似乎有一个合理的答案。

首先:您是在生成并安装
.tar.gz
发行版,还是那些旧的不推荐的
.egg
发行版?因为在某些情况下,这可能涉及到在操作系统上保留哪些文件属性的归档格式的问题。:)如果使用
scripts
关键字安装,它将获得正确的模式(并安装在适当的
bin/
目录中)。@larsks:在我的情况下,可执行文件是由第三方提供的文件。该脚本用作此文件的包装器。你的评论确实解决了我的问题。但这个问题仍然很有趣:在安装后,如何对包中包含的文件执行某些操作?