Python中可移植性的大清单

时间:2009-12-10 18:41:57

标签: python portability

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

请为每个评论发布一个问题(及其修复)。

7 个答案:

答案 0 :(得分:4)

如果您在Python中处理二进制文件格式,请注意structarray模块使用依赖于机器的大小和字节顺序。通过始终在格式字符串中使用struct<,可以移植使用>array不能。它可能是可移植的字节数组,但文档没有这样的保证。

答案 1 :(得分:3)

'Universal newline support'(如PEP278中所述)因便携性原因而派上用场 它确保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'

答案 2 :(得分:2)

远离语法方面,我认为最值得注意的是,通常当人们想到python时,他们可能不会想到它所组成的所有库。

许多python包依赖于C库,这些库可能是也可能不是跨平台兼容的。此外,Python通过Jython在Java下运行,而通过IronPython在.Net中运行。除非库是用纯python编写的,否则它们在许多情况下不会处理除基于C语言的python之外的任何其他内容。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

Unix与Windows:在Popen模块中使用subprocess会在shell=True时出现不同的行为。我不会提供修复,因为讨论得到了很好的解决here,但这是可能出乎意料地咬你的那些领域之一。

答案 5 :(得分:1)

我将开始:

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

Unix使用正斜杠表示路径分隔符 - &gt; '/'

os模块附带os.sep,其中包含运行脚本的当前平台的路径分隔符。使用os.sep代替前向或反斜杠。 os.path.join会以这种方式加入两个或多个路径组件。

答案 6 :(得分:1)

由于错误,冲突或弃用的标准等,UCS2和UCS4(例如Windows和Linux)构建版本存在细微差别。

示例:Issue 3297

unicodetest.py

#-*- coding: utf-8 -*-
print 'Result:', u'?' == u'\U00010123'
print 'Len:', len(u'?'), len(u'\U00010123')
print 'Repr:', repr(u'?'), repr(u'\U00010123')

输出(Python 2.6,Linux):

Result: False
Len: 2 1
Repr: u'\ud800\udd23' u'\U00010123'