如何在 Windows 10 中使用 msiexec 安装两个 python 2.7.18 实例?
How can I install two instances of python 2.7.18 with msiexec in Windows 10?
我的计算机中有一个 Python 2.7.18 实例 Windows 10(位于 C:\Python27
)。
现在,我想安装另一个完全相同的实例 Python 到另一个位置(例如 C:\my_app\python27
),但是我的 msiexec 程序有问题。
我有来自 Python 网站的“python-2.7.18.amd64.msi”安装程序,当我启动它时,它会询问我是否要更改、修复或删除已安装的实例.
我了解了可以使用的不同标志和设置(例如,TARGETDIR
、APPDIR
、INSTALLDIR
等),但没有任何帮助。
我确信这可能是因为它只是将副本安装到另一个位置。
我该怎么做?
MSI 通过安装程序中嵌入的许多 GUID“知道”安装了什么。此设计是 MSI 的“固有”设计,因此“by-design”并非旨在或完全适用于多个实例:
Package Code:唯一标识一个MSI文件。这个 GUID 在两个 MSI 文件之间永远不应该相同,除非它是已复制的同一个文件(那么它当然是同一个文件 - 二进制相同)。如果两个 MSI 文件不同并且具有相同的包 GUID,它们将被视为 by-design 相同的文件。这可能会导致一些您曾经遇到过的最神秘的问题。总是 auto-generate 这个 GUID(从技术上讲,它不应该公开?)。
产品代码:标识已安装产品的唯一产品实例。您不能使用相同的产品 GUID 一遍又一遍地安装相同的 MSI。您可以 in-place 使用次要升级来升级现有安装(然后 MSI 之间的产品代码相同)。这会产生一个更新的实例,而不是你喜欢的两个 side-by-side 安装。这是使该 MSI 的第二个 运行 出现在维护模式(修复、修改、卸载)中的 GUID - 如“此产品已安装”。这里有一些复杂的包代码涉及虽然 - 技术细节(你不能轻易愚弄它 - 不要打 MSI 它会反击)。
升级代码:标识一个产品系列。以某种方式相关的产品。通常用于实施重大升级。换句话说,用新的更高版本替换已安装的旧版本。在相关版本中通常应该是稳定的。还有其他方法。知道自己在做什么。
有很多方法可以解决这个问题。以下是一些建议:
- I want to install an MSI twice
- Installing Multiple Instances by different msi having same Package Code
所以本质上:1)
虚拟化,2)
Side-by-side 安装,3)
实例转换。或者 4)
只使用旧版 non-MSI 安装程序?
对于没有注册表纠缠的简单产品,您可以简单地复制该文件夹,但对于真正的产品,这种情况很少见。有注册的 COM 服务器、GAC-involvement、冲突的文件关联以及许多其他问题,这些问题通常导致虚拟化成为“最不糟糕”的选择。
Side-by-side 安装还需要一些技术调整 - 最重要的是 changing all component GUIDs to be valid MSI - 除非你使用实例转换概念(我不使用)。
WiX 引入了 "auto-guids". These are component GUIDs that are automatically generated (for most component types) so that they can change depending on where you install on disk. Blog from Bob Arnson: Simplifying WiX component authoring 的概念。
There are also features to simplify WiX source xml.
链接:
- How to update Windows installer package over installed msi with same product id
您听说过 Anaconda Distribution 用于安装 Python 的多个版本吗?
基本上,conda 是用于维护不同 python 环境并在这些环境中安装和管理包的工具。
安装指南: https://docs.anaconda.com/anaconda/install/windows/
安装完成后可以执行以下命令:
conda create --name "python_env1" python=2.7.18 pip3
conda activate python_env1
conda deactivate
conda create --name "python_env2" python=2.7.18 pip3
conda activate python_env2
希望这个回答对您有所帮助。
我的计算机中有一个 Python 2.7.18 实例 Windows 10(位于 C:\Python27
)。
现在,我想安装另一个完全相同的实例 Python 到另一个位置(例如 C:\my_app\python27
),但是我的 msiexec 程序有问题。
我有来自 Python 网站的“python-2.7.18.amd64.msi”安装程序,当我启动它时,它会询问我是否要更改、修复或删除已安装的实例.
我了解了可以使用的不同标志和设置(例如,TARGETDIR
、APPDIR
、INSTALLDIR
等),但没有任何帮助。
我确信这可能是因为它只是将副本安装到另一个位置。
我该怎么做?
MSI 通过安装程序中嵌入的许多 GUID“知道”安装了什么。此设计是 MSI 的“固有”设计,因此“by-design”并非旨在或完全适用于多个实例:
Package Code:唯一标识一个MSI文件。这个 GUID 在两个 MSI 文件之间永远不应该相同,除非它是已复制的同一个文件(那么它当然是同一个文件 - 二进制相同)。如果两个 MSI 文件不同并且具有相同的包 GUID,它们将被视为 by-design 相同的文件。这可能会导致一些您曾经遇到过的最神秘的问题。总是 auto-generate 这个 GUID(从技术上讲,它不应该公开?)。
产品代码:标识已安装产品的唯一产品实例。您不能使用相同的产品 GUID 一遍又一遍地安装相同的 MSI。您可以 in-place 使用次要升级来升级现有安装(然后 MSI 之间的产品代码相同)。这会产生一个更新的实例,而不是你喜欢的两个 side-by-side 安装。这是使该 MSI 的第二个 运行 出现在维护模式(修复、修改、卸载)中的 GUID - 如“此产品已安装”。这里有一些复杂的包代码涉及虽然 - 技术细节(你不能轻易愚弄它 - 不要打 MSI 它会反击)。
升级代码:标识一个产品系列。以某种方式相关的产品。通常用于实施重大升级。换句话说,用新的更高版本替换已安装的旧版本。在相关版本中通常应该是稳定的。还有其他方法。知道自己在做什么。
有很多方法可以解决这个问题。以下是一些建议:
- I want to install an MSI twice
- Installing Multiple Instances by different msi having same Package Code
所以本质上:1)
虚拟化,2)
Side-by-side 安装,3)
实例转换。或者 4)
只使用旧版 non-MSI 安装程序?
对于没有注册表纠缠的简单产品,您可以简单地复制该文件夹,但对于真正的产品,这种情况很少见。有注册的 COM 服务器、GAC-involvement、冲突的文件关联以及许多其他问题,这些问题通常导致虚拟化成为“最不糟糕”的选择。
Side-by-side 安装还需要一些技术调整 - 最重要的是 changing all component GUIDs to be valid MSI - 除非你使用实例转换概念(我不使用)。
WiX 引入了 "auto-guids". These are component GUIDs that are automatically generated (for most component types) so that they can change depending on where you install on disk. Blog from Bob Arnson: Simplifying WiX component authoring 的概念。
There are also features to simplify WiX source xml.
链接:
- How to update Windows installer package over installed msi with same product id
您听说过 Anaconda Distribution 用于安装 Python 的多个版本吗?
基本上,conda 是用于维护不同 python 环境并在这些环境中安装和管理包的工具。
安装指南: https://docs.anaconda.com/anaconda/install/windows/
安装完成后可以执行以下命令:
conda create --name "python_env1" python=2.7.18 pip3
conda activate python_env1
conda deactivate
conda create --name "python_env2" python=2.7.18 pip3
conda activate python_env2
希望这个回答对您有所帮助。