我认为在编写可移植Python应用程序时需要注意的事项列表是个好主意。可移植性中存在许多微妙的“陷阱”,只有通过经验和彻底的测试才能发现;需要某种列表来解决更常见的问题。
请为每个评论发布一个问题(及其修复)。
答案 0 :(得分:4)
如果您在Python中处理二进制文件格式,请注意struct
和array
模块使用依赖于机器的大小和字节顺序。通过始终在格式字符串中使用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)构建版本存在细微差别。
#-*- 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'