Ошибка компиляции Python для кода, реализованного в Windows и пытающегося работать в Linux - PullRequest
0 голосов
/ 17 июня 2011

Я на 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 или нет. Любая помощь?

Другой вопрос: я хочу запустить эту программу на Python под CRONTAB, есть ли что-то, что я должен изменить или включить, чтобы я мог запустить его как «скрипт» или что-то подобное?

Спасибо большое!

1 Ответ

2 голосов
/ 17 июня 2011

У вас есть модуль с именем socket, и вы пытаетесь импортировать из него модуль socket. Модуль явно скрывает встроенный модуль socket (т. Е. Ваш socket импортирует сам себя). Если этот модуль не является пакетом, переместите его в пакет. Если / когда модуль уже находится в пакете (я предполагаю, что weatherData - это пакет), убедитесь, что перед любым другим кодом у вас есть следующая строка:

from __future__ import absolute_import

Это гарантирует, что все операции импорта из этого модуля будут абсолютными , т.е. socket является модулем верхнего уровня socket, в то время как ваш модуль всегда доступен через имя weatherData.socket, поскольку он является частью этого пакета, и два модуля не будут конфликтовать.

Также это будет работать, только если weatherData действительно является пакетом, если socket является модулем верхнего уровня, вам нужно либо переименовать его, либо переместить в пакет, потому что в противном случае имена будут конфликтовать независимо от того, разрешен относительный импорт, и вы не сможете использовать оба модуля вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...