Distutils在Ubuntu上忽略build/lib

1 投票
2 回答
534 浏览
提问于 2025-04-20 10:03

我有一个 setup.py 脚本,它会把一些文件构建到 ./build/lib 这个目录里。这些文件是通过我自定义的 distutils.command.build.build 类中的 run() 方法生成的:

from distutils.command.build import build
from distutils.core import setup

class MyBuild(build):
    def run(self):
        # Populate files to ./build/lib

setup(
    # ...
    cmdclass=dict(build=MyBuild)
)

根据这篇文章,这个设置脚本应该把 ./build/lib 目录里的所有东西复制到安装目录。在OSX上,这个过程是正常的,但在Ubuntu 14.04上却不一样,它忽略了 ./build/lib 目录,而是安装了 ./build/lib.<plat> 目录里的文件。而在OSX上,./build/lib.<plat> 目录又被忽略了。

有没有一种一致的、与平台无关的方法来使用distutils构建和安装文件呢?这些文件是与平台无关的。

2 个回答

0

最简单的解决办法似乎是在 distutils.command.build.build 这个命令类中设置 build_lib 属性。这个属性是在 initialize_options() 方法中设置的,而我们需要重写这个方法来设置这个属性:

from distutils.command.build import build
from distutils.core import setup

class MyBuild(build):
    def initialize_options(self):
        build.initialize_options(self)
        self.build_lib = 'build/lib'

    def run(self):
        # Populate files to ./build/lib

setup(
    # ...
    cmdclass=dict(build=MyBuild)
)
1

MyBuild.run()这个方法里,要把文件放到self.build_lib指定的路径,而不是写死一个固定的路径。

from distutils.command.build import build
from distutils.core import setup

class MyBuild(build):
    def run(self):
        build_path = self.build_lib
        # Populate files to 'build_path'

setup(
    # ...
    cmdclass=dict(build=MyBuild)
)

不要在MyBuild.run()里改变self.build_lib的值,因为这个值是根据命令行参数和一些默认值生成的。其他一些属性,比如build_scriptsbuild_basebuild_purelib等,也是一样的道理。

撰写回答