Python 覆盖setup.cfg选项以实现默认行为

Python 覆盖setup.cfg选项以实现默认行为,python,py2exe,distutils,setup.py,Python,Py2exe,Distutils,Setup.py,我有一个包含Linux安装选项的setup.cfg [install] prefix=/opt/foo install-lib=/opt/foo 对应于此项目在Linux下的默认目录布局 现在,同一个项目使用py2exe进行Windows安装。目前,我正在运行python setup.py py2exe时使用.bat文件将setup.cfg移到一边,以避免将py2exe与那些设置混淆,我认为这相当于使用默认参数的distutils/py2exe 我更愿意使用一些额外的参数来调用python s

我有一个包含Linux安装选项的setup.cfg

[install]
prefix=/opt/foo
install-lib=/opt/foo
对应于此项目在Linux下的默认目录布局

现在,同一个项目使用py2exe进行Windows安装。目前,我正在运行
python setup.py py2exe
时使用.bat文件将setup.cfg移到一边,以避免将py2exe与那些设置混淆,我认为这相当于使用默认参数的distutils/py2exe

我更愿意使用一些额外的参数来调用
python setup.py py2exe
,以覆盖setup.cfg中指定的参数,但是使用
--prefix=--install lib=

[...]
*** copy data files ***
Traceback (most recent call last):
  File "setup.py", line 158, in <module>
    **platformOptions)
  File "C:\Python27\lib\distutils\core.py", line 152, in setup
    dist.run_commands()
  File "C:\Python27\lib\distutils\dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "C:\Python27\lib\distutils\dist.py", line 972, in run_command
    cmd_obj.run()
  File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 243, in run
    self._run()
  File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 312, in _run
    self.create_binaries(py_files, extensions, dlls)
  File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 560, in create_binaries
    install_data.ensure_finalized()
  File "C:\Python27\lib\distutils\cmd.py", line 109, in ensure_finalized
    self.finalize_options()
  File "C:\Python27\lib\distutils\command\install_data.py", line 41, in finalize_options
    ('force', 'force'),
  File "C:\Python27\lib\distutils\cmd.py", line 298, in set_undefined_options
    src_cmd_obj.ensure_finalized()
  File "C:\Python27\lib\distutils\cmd.py", line 109, in ensure_finalized
    self.finalize_options()
  File "C:\Python27\lib\distutils\command\install.py", line 353, in finalize_options
    'userbase', 'usersite')
  File "C:\Python27\lib\distutils\command\install.py", line 504, in convert_paths
    setattr(self, attr, convert_path(getattr(self, attr)))
  File "C:\Python27\lib\distutils\util.py", line 199, in convert_path
    raise ValueError, "path '%s' cannot be absolute" % pathname
ValueError: path '/opt/trelby' cannot be absolute
[…]
***复制数据文件***
回溯(最近一次呼叫最后一次):
文件“setup.py”,第158行,在
**平台选项)
文件“C:\Python27\lib\distutils\core.py”,第152行,在安装程序中
dist.run_命令()
文件“C:\Python27\lib\distutils\dist.py”,第953行,在run\u命令中
self.run_命令(cmd)
文件“C:\Python27\lib\distutils\dist.py”,第972行,在run\u命令中
cmd_obj.run()
文件“C:\Python27\lib\site packages\py2exe\build\u exe.py”,第243行,正在运行
self._run()
文件“C:\Python27\lib\site packages\py2exe\build\u exe.py”,第312行,正在运行
self.create_二进制文件(py_文件、扩展名、DLL)
文件“C:\Python27\lib\site packages\py2exe\build\u exe.py”,第560行,在create\u二进制文件中
安装\u数据。确保\u已完成()
文件“C:\Python27\lib\distutils\cmd.py”,第109行,最后确定
self.finalize_选项()
文件“C:\Python27\lib\distutils\command\install\u data.py”,第41行,在finalize\u选项中
(‘force’、‘force’),
文件“C:\Python27\lib\distutils\cmd.py”,第298行,在set\u undefined\u options中
src_cmd_obj.确保已完成()
文件“C:\Python27\lib\distutils\cmd.py”,第109行,最后确定
self.finalize_选项()
文件“C:\Python27\lib\distutils\command\install.py”,第353行,在finalize\u选项中
“userbase”、“usersite”)
文件“C:\Python27\lib\distutils\command\install.py”,第504行,在convert\u路径中
setattr(self,attr,convert_path(getattr(self,attr)))
文件“C:\Python27\lib\distutils\util.py”,第199行,在convert\u路径中
raise VALUERROR,“路径“%s”不能是绝对路径“%pathname”
ValueError:路径“/opt/trelby”不能是绝对路径
这与根本不尝试覆盖setup.cfg参数时的行为相同,因此似乎出现了问题

如果有必要,我也愿意在setup.py中设置
distutils.core.setup()
选项
参数,但主要问题似乎是:为了实现默认的py2exe行为,设置为什么值


顺便说一句,代码在

中找到,我试图复制您的错误,但无法访问win*,可能还有更新的distutils

ValueError:path'/opt/trelby'不能是绝对的
这很重要,如果出于任何原因必须使用相对路径,请确保使用相对路径

我对普通distutils没有这种错误

python setup.py install--prefix/some/other
如果在config.cfg中指定了安装库,那么它对我没有任何作用

python setup.py安装--install lib/some/other
会更改安装路径

换句话说,我的设置中的优先级是:

  • 安装lib cmd行参数
  • 在setup.fg中安装lib
  • 前缀cmd行arg
  • setup.cfg中的前缀

请在不使用py2exe的情况下进行测试。如果您的问题源于distutils,也许您可以升级它们。或者,它可以是py2exe,它接受命令行参数,而不将这些参数传递给distutils,也许你可以追踪它并提交一个补丁。

为什么不使用setup\u win.py和setup\u lin.py作为例子?Linux和Windows安装的大多数设置和逻辑都是相同的,所以我宁愿避免使用单独的setup\u*.py文件。对不起,这没有帮助。整个问题是关于使用py2exe--setup.cfg和没有它们的命令行参数优先级,我认为这有点微不足道;默认的Linux安装位置应该是
/opt/trelby
,所以我不能只将其设置为相对位置;我不知道你所说的“不要在普通的setuptools中出现这种错误”是什么意思——setuptools并没有真正参与其中,或者你是说distutils?此外,如果不指定使用哪个版本(我的Python版本是2.7.3,FWIW),关于distutils版本和升级的模糊假设也没有帮助。