Python 使用“setup.py”安装包后运行“chmod”`
假设我有一个包,它调用代码中的某个可执行文件(例如第三方c/java程序)。让我们进一步假设,应用程序非常小/微不足道,足以与包捆绑在一起。例如,单个可执行文件(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.
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:在我的情况下,可执行文件是由第三方提供的文件。该脚本用作此文件的包装器。你的评论确实解决了我的问题。但这个问题仍然很有趣:在安装后,如何对包中包含的文件执行某些操作?