Python可移植性问题

Python可移植性问题,python,jar,pip,portability,easy-install,Python,Jar,Pip,Portability,Easy Install,基本上,我是一名想要学习Python语言的Java程序员。我想澄清为什么一些python库使用不可移植的方式分发 让我解释一下我的想法。如果有人使用Java创建常规库,他会准备1(一)个可在不同平台上使用的JAR文件: my-great-lib-1.2.4.jar 我可以在任何版本的Windows或Linux上使用这个库(相同的文件) 与Java不同,python库可能如下所示: bsdiff4-1.1.4.win-amd64-py2.5.exe bsdiff4-1.1.4.win-amd64

基本上,我是一名想要学习Python语言的Java程序员。我想澄清为什么一些python库使用不可移植的方式分发

让我解释一下我的想法。如果有人使用Java创建常规库,他会准备1(一)个可在不同平台上使用的JAR文件:

my-great-lib-1.2.4.jar
我可以在任何版本的Windows或Linux上使用这个库(相同的文件)

与Java不同,python库可能如下所示:

bsdiff4-1.1.4.win-amd64-py2.5.exe
bsdiff4-1.1.4.win-amd64-py2.6.exe
bsdiff4-1.1.4.win-amd64-py2.7.exe
bsdiff4-1.1.4.win-amd64-py3.2.exe
bsdiff4-1.1.4.win-amd64-py3.3.exe
bsdiff4-1.1.4.win32-py2.5.exe
bsdiff4-1.1.4.win32-py2.6.exe
bsdiff4-1.1.4.win32-py2.7.exe
bsdiff4-1.1.4.win32-py3.2.exe
bsdiff4-1.1.4.win32-py3.3.exe
请参阅上的完整列表

我觉得很奇怪。即使是32位和64位平台也需要不同的安装程序。安装工!为什么我需要安装程序才能使用一个库?此外,概述的安装程序仅适用于Windows。它们中的每一个都绑定到特定的python版本。便携性在哪里


有谁能解释一下上面10个不同文件的必要性吗?

对于一个python版本,请随意选择。在Python3中,一些内置的语法完全改变了。例如:

raw_input()
改为:

input()

而且,即使在3.4的alpha版本中,很多标准库也发生了变化。至于32/64位的问题,我无法完全回答。我知道某些平台在尝试运行32/64时会遇到问题,这可能就是问题所在。

有很多复杂问题。在Java中,代码和字节代码由JVM解释,只要代码由JVM很好地解释,固有的计算机体系结构就不起作用。事实上,这是Java如此流行的主要原因之一,因为您的代码只需要担心JVM是否正确编译

然而,在Python中情况是不同的。我试图在以下几行中总结一些我认为重要的原因:

  • 语言本身正在进化(尽管你认为它在场景中很长!),语言内部正在发生变化。添加了新特性,有时甚至对语言进行了一些重构(从Python 2.x到Python 3.x)
  • Python严重依赖其C扩展,用Python编写的应用程序也是如此。如果您编写了一个python程序,并且有一些CPU密集型代码,那么您可以选择用C编写。这还增加了为各种发行版创建大量库的必要性

一般来说,Python库可以跨平台移植。在不同的主要Python版本之间(3引入了2的一些重大更改,但2.7与2.6向后兼容)或使用C代码优化CPU密集型代码时会出现问题。在Linux上,自己编译并不是问题,当您调用pip安装包时,它将为您完成这项工作。问题出在Windows上,在Windows上编译C程序要困难得多,特别是因为不是每个人都有编译器。因此,对于需要C语言的Windows软件包,通常需要安装程序

此外,使用安装程序是因为它们很好地设置了所有内容,在注册表中查找放置所有内容的适当位置,提供了标准的卸载方法(可以使用控制面板中的“添加/删除程序”删除Chrisother Goelke网站上的安装程序)因为这是Windows上的标准:Windows上的大多数程序都是通过exe安装的,因为它没有标准且广泛使用的包管理器


所有这些库都是可移植的:您可以从任何平台使用它们,但安装它们是不同的

py
后面的数字用于不同版本的python。你是说Java只有一个版本吗?可移植性在于编译这些代码的C代码中——如果你使用像
pip
这样的包管理器,那么你可以为自己的平台编译它。如果我为Java 6编译我的单个jar,它将在Java 6、7、8上工作。还有一个罐子。安装它们是不可移植的。