Python中可移植性的大列表

Python中可移植性的大列表,python,portability,Python,Portability,我认为在制作一个可移植的Python应用程序时,编写一个需要注意的事项列表是一个好主意。可移植性中有很多微妙的“陷阱”,只有通过经验和彻底的测试才能发现;需要某种列表来解决更常见的问题 请在每条评论中发布一个gotcha(及其修复)。我将开始: Windows使用反斜杠作为路径分隔符-->'\' Unix使用正斜杠作为路径分隔符-->'/' os模块附带了os.sep,其中包含运行脚本的当前平台的路径分隔符。使用os.sep而不是前斜杠或后斜杠os.path.join将以这种方式连接两个或多个路

我认为在制作一个可移植的Python应用程序时,编写一个需要注意的事项列表是一个好主意。可移植性中有很多微妙的“陷阱”,只有通过经验和彻底的测试才能发现;需要某种列表来解决更常见的问题

请在每条评论中发布一个gotcha(及其修复)。

我将开始:

Windows使用反斜杠作为路径分隔符-->'\'

Unix使用正斜杠作为路径分隔符-->'/'

os模块附带了
os.sep
,其中包含运行脚本的当前平台的路径分隔符。使用
os.sep
而不是前斜杠或后斜杠
os.path.join
将以这种方式连接两个或多个路径组件。

(如中所述)出于可移植性的原因可以派上用场。
它确保python代码只获取
\n

christophe@orion:~$ printf 'testing pep278\r\n' > test.txt
christophe@orion:~$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> open('test.txt').read()
'testing pep278\r\n'
>>> open('test.txt','U').read()
'testing pep278\n'

离开语法方面,我认为最需要注意的是,通常当人们想到python时,他们可能不会想到它所包含的所有库


许多python包依赖于C库,这些库可能是跨平台兼容的,也可能不是跨平台兼容的。此外,Python通过Jython在Java下运行,通过IronPython在.Net下运行。除非库是用纯python编写的,否则在许多情况下,它们只能在基于C的python版本上工作。

由于bug、冲突或不推荐使用的标准等原因,python的UCS2和UCS4(例如Windows和Linux)版本存在细微的差异

例子: :

输出(Python 2.6,Linux):



如果在Python中处理二进制文件格式,请注意
struct
array
模块使用依赖于机器的大小和endianness<代码>结构可通过始终在格式字符串中使用
进行便携使用<代码>数组不能。对于字节数组来说,它可能是可移植的,但是文档中没有这样的保证。

一些模块不是跨平台的。想到的两个是
诅咒(Linux)和
msvcrt
(Windows)。解决这个简单问题的方法就是不使用它们,而是找到一个替代方法。

Unix与Windows:在
子流程中使用
Popen
模块将在
shell=True
时表现出不同的行为。我不会提供解决方案,因为讨论内容涵盖得太多了,但这是一个可能会出乎意料地伤害到你的领域。

应该是社区维基。我们是在谈论跨平台的可移植性,还是能够打包并作为应用程序/鸡蛋/任何东西分发?你能提供一个“微妙的‘抓住你了’的例子吗?所有特定于操作系统的内容都有明确的文档记录。请展示一个通过“微妙”测试的东西。这个主题太模糊了,你只会得到Python文档模块的一个糟糕摘要,它非常好,而且更容易搜索。也许你应该更具体一点。在任何情况下,都必须是维基。@S.洛特:我没有太多的经验,所以它们对我来说都很微妙。或者你可以在所有平台上使用
/
。我不认为
os.pathsep
做你认为它做的事情:
-os.pathsep是$PATH etc中使用的组件分隔符
@jcd:你的声明有来源吗?考虑更多的平台,而不仅仅是UNIX和Windows(就像这个答案)。还要考虑未来尚未预料到的平台。哪种Python代码更适合?使用
os.path.join
或使用
/
?@jcd:您从未遇到过Windows实用程序将以
'/'
开头的路径视为命令行选项:
'/help'!=r'c:\help'
@Chris:下面是我从“编程Python”第107页得到的信息:“
os.sep
是用于在运行Python的平台上分隔目录组件的任何字符”。左手边缺少什么,还是真的应该是
u'
(空字符串)?此外,问题不在于Windows Linux,而在于Python构建了配置的窄(任何平台)和宽unicode(任何平台)。@kaizer.se:1。u''2中应该有“爱琴海二千号”字符。从技术上讲,您是正确的,您可以编译python以使用任一表示形式,但从技术上讲,您也可以编译python而不使用unicode支持。
数组
仍然可以与基于
sys.byteorder
的有条件的
.byteswap()
一起使用,速度非常快。如果有人感兴趣,一些谷歌搜索确实揭示了在Windows上为Python开发curses模块的努力:
#-*- coding: utf-8 -*-
print 'Result:', u'𐄣' == u'\U00010123'
print 'Len:', len(u'𐄣'), len(u'\U00010123')
print 'Repr:', repr(u'𐄣'), repr(u'\U00010123')
Result: False
Len: 2 1
Repr: u'\ud800\udd23' u'\U00010123'