2011-06-16 67 views
0

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

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' 

在Linux上相同的代码时,我收到了奇怪的编译错误对应的代码段会

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程序,是否有任何事情我应该改变或包含,以便我可以将它作为“脚本”或类似的东西运行?

非常感谢!

+0

奇怪的是,这不适用于Python 3.1,你能分享更多关于你的目录结构和模块组织吗?在“weatherScript.py”所在的目录中,什么是“sys.path”(或至少是与“weatherData/socket.py”对应的部分)? – 2011-06-16 20:56:44

回答

2

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

from __future__ import absolute_import 

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

此外,如果weatherData确实是一个包,如果socket是你需要或者将其重命名,或将其移动到一个包,因为否则的名称将发生冲突的顶层模块,无论相对进口产品是否这只会工作允许的,你将无法一起使用这两个模块。

+0

我不太明白你的答案。使用导入套接字,我实际上是遵循python.org上的套接字文档,它所做的(我相信)是导入内置套接字模块。该代码在Windows上运行得非常好,但我不知道为什么它不适用于Linux。 – 2011-06-16 20:54:11

+0

weatherData只是一个放置python程序的文件夹。 – 2011-06-16 20:55:19

+0

如果你在程序所在的目录下有一个'socket.py'文件,你*不能*导入内建的''socket''模块,因为你的'socket.py'会映射它。 http://docs.python.org/tutorial/modules.html – 2011-06-16 20:58:40

相关问题