<p>我定义了一个自定义的<code>build_ext</code>来构建一个有趣的扩展,我试图使pip友好。以下是我正在做的事情的精简版。在</p>
<pre><code>foo_ext = Extension(
name='foo/_foo',
sources=foo_sources,
)
class MyBuildExt(build_ext):
def build_extension(self, ext):
# This standalone script builds the __init__.py file
# and some .h files for the extension
check_call(['python', 'build_init_file.py'])
# Now that we've created all the init and .h code
# build the C/C++ extension using setuptools/distutils
build_ext.build_extension(self, ext)
# Include the generated __init__.py in the build directory
# which is something like `build/lib.linux-x86/foo/`.
# How can I get setuptools/distutils to install the
# generated file automatically?!
generated_file = 'Source/foo/__init__.py'
output_path = '/'.join(self.get_outputs()[0].split('/')[:-1])
self.move_file(generated_file, output_path)
setup(
...,
ext_modules = [foo_ext],
cmdclass={'build_ext' : MyBuildExt},
)
</code></pre>
<p>在打包这个模块并用pip安装之后,我在virtualenv的site packages目录中有一个模块<code>foo</code>。目录结构如下所示。在</p>
^{pr2}$
<p><code>egg-info/SOURCES.txt</code>文件<strong>不包括</strong>我手动创建/移动的<code>__init__.py</code>文件。当我执行<code>pip uninstall foo</code>时,该命令将<code>foo/__init__.py</code>留在virtualenv的站点包中。我想让皮普删除整个包。如何将生成的<code>__init__.py</code>文件手动移到构建目录中,添加到已安装的输出文件列表中?在</p>
<p>我知道这是令人厌恶的和老套的,所以我欢迎恶心和粗糙的答案!在</p>
<h2>尝试次数:</h2>
<ol>
<li>添加了<code>packages=['foo']</code>——当我这样做时,pip不构建扩展。还尝试调整包名的文件路径/命名空间版本——没有区别。在</li>
</ol>