在Windows上实现并尝试在Linux上运行的代码的Python编译错误

时间:2011-06-16 20:44:16

标签: python windows linux compilation

我是100%的Python新手我在涉及Windows和Linux之间切换时的兼容性时遇到了这个奇怪的问题。我实现了一个实现TCP / IP套接字的小程序,该套接字与支持TCP / IP服务器套接字的设备通信。我的程序在Windows上运行时工作正常,所以我决定在Linux上测试它,因为最终我想在CRONTAB上运行它作为从服务器获取信息并导出到XML的计划任务。这是我尝试在Linux上编译相同代码时收到的奇怪的编译错误(在python 2.6,2.7和3.1下)

python2.7 weatherScript.py 
Traceback (most recent call last):
File "weatherScript.py", line 1, in <module>
    import socket
File "/media/SWAP/weatherData/socket.py", line 117, in <module>
    except socket.error, msg:
AttributeError: 'module' object has no attribute 'error'

相应的代码段将是

import socket

import sys

import re

from time import sleep

from xml.dom.minidom import Document

try:

    comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

except socket.error, msg:

    sys.stderr.write("[ERROR] %s\n" % msg[1])

    sys.exit(1)



#connecting to weather station

try:

    comSocket.connect(())

except socket.error, msg:

    sys.stderr.write("[ERROR] %s\n" % msg[1])

    sys.exit(2)

即使我删除了try-catch,问题仍然存在。我不确定Windows或Linux之间是否存在任何编译不兼容性。有什么帮助吗?

其他问题是:我想在CRONTAB下运行那个python程序,是否有任何我应该更改或包含的内容,以便我可以将其作为“脚本”运行?或者

非常感谢你!

1 个答案:

答案 0 :(得分:2)

您有一个名为socket的模块,并且您正在尝试从中导入socket模块。该模块显然隐藏了内置socket模块(即您的socket正在导入自身)。如果此模块不是包,请将其移至包中。如果/当模块已经在一个包中(我假设weatherData是一个包),请确保在任何其他代码之前有以下行:

from __future__ import absolute_import

这确保从模块完成的所有导入都是绝对,即socket是顶级socket模块,而您的模块始终通过名称访问weatherData.socket因为它是该软件包的一部分,并且这两个模块不会发生冲突。

此功能仅在weatherData确实是包时才有效,如果socket是您需要重命名的顶级模块,或者将其移动到包中,因为否则名称会无论是否允许相对导入都会发生冲突,并且您将无法一起使用这两个模块。