Trouble with PySerial and multiple Python installations

梦想与她 提交于 2019-12-12 19:42:29

问题


I have Python 2.4.4 and 3.1.3 on my Windows 7 machine. I would like to use PySerial.

I heard that it was built in, so I tried import serial in both versions. Both caused an Import Error.

Then I downloaded the win32 installer from this page. I ran it, and it installed for 2.4.4. (It said it found it from the registry.) I had no option to change to the 3.1.1 version.

I then got the following error in 2.4.4:

>>> import serial

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in -toplevel-
    import serial
  File "C:\Python24\Lib\site-packages\serial\__init__.py", line 19, in -toplevel-
    from serialwin32 import *
  File "C:\Python24\Lib\site-packages\serial\serialwin32.py", line 11, in -toplevel-
    import ctypes
ImportError: No module named ctypes

I look up ctypes, and see that it has been bulit in since 2.5.5. Ok.

I download ctypes, and run python setup.py install. (2.4.4.)

I get the following:

C:\path\to\ctypes-1.0.2>python setup.py install
running install
running build
running build_py
running build_ext
error: Python was built with Visual Studio 2003;
extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2003 was not found on this system. If you have Cygwin installed,
you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

Sweet. Ok. That seems like too much effort, so I'd like to try with Python 3.1.1. I edit my PATH environment variable to include C:\Python31\ instead of C:\Python24.

I restart cmd and run python setup.py install on pyserial:

C:\path\to\pyserial-2.5>python setup.py install
running install
running build
running build_py
running build_scripts
running install_lib
running install_scripts

C:\path\to\pyserial-2.5>

Interesting. I then try to import serial from IDLE in Python 3.1.1, but I get the standard ImportError. Hmm.

What is going on here? Am I doing something wrong?

Update: I tried to run setup.py install using 3.1.1:

c:\path\to\pyserial-2.5>c:\python31\python.exe setup.py install
running install
running build
running build_py
running build_scripts
creating build\scripts-3.1
copying and adjusting examples\miniterm.py -> build\scripts-3.1
running install_lib
creating c:\python31\Lib\site-packages\serial
copying build\lib\serial\loopback_connection.py -> c:\python31\Lib\site-packages
\serial
copying build\lib\serial\rfc2217.py -> c:\python31\Lib\site-packages\serial
copying build\lib\serial\serialcli.py -> c:\python31\Lib\site-packages\serial
copying build\lib\serial\serialjava.py -> c:\python31\Lib\site-packages\serial
copying build\lib\serial\serialposix.py -> c:\python31\Lib\site-packages\serial
copying build\lib\serial\serialutil.py -> c:\python31\Lib\site-packages\serial
copying build\lib\serial\serialwin32.py -> c:\python31\Lib\site-packages\serial
copying build\lib\serial\sermsdos.py -> c:\python31\Lib\site-packages\serial
copying build\lib\serial\socket_connection.py -> c:\python31\Lib\site-packages\s
erial
copying build\lib\serial\win32.py -> c:\python31\Lib\site-packages\serial
copying build\lib\serial\__init__.py -> c:\python31\Lib\site-packages\serial
byte-compiling c:\python31\Lib\site-packages\serial\loopback_connection.py to lo
opback_connection.pyc
  File "c:\python31\Lib\site-packages\serial\loopback_connection.py", line 101
    except ValueError, e:
                     ^
SyntaxError: invalid syntax

byte-compiling c:\python31\Lib\site-packages\serial\rfc2217.py to rfc2217.pyc
  File "c:\python31\Lib\site-packages\serial\rfc2217.py", line 370
    except Exception, msg:
                    ^
SyntaxError: invalid syntax

byte-compiling c:\python31\Lib\site-packages\serial\serialcli.py to serialcli.py
c
  File "c:\python31\Lib\site-packages\serial\serialcli.py", line 39
    except Exception, msg:
                    ^
SyntaxError: invalid syntax

byte-compiling c:\python31\Lib\site-packages\serial\serialjava.py to serialjava.
pyc
  File "c:\python31\Lib\site-packages\serial\serialjava.py", line 67
    except Exception, msg:
                    ^
SyntaxError: invalid syntax

byte-compiling c:\python31\Lib\site-packages\serial\serialposix.py to serialposi
x.pyc
  File "c:\python31\Lib\site-packages\serial\serialposix.py", line 64
    50:      0000001,
                   ^
SyntaxError: invalid token

byte-compiling c:\python31\Lib\site-packages\serial\serialutil.py to serialutil.
pyc
  File "c:\python31\Lib\site-packages\serial\serialutil.py", line 510
    except TypeError, err:
                    ^
SyntaxError: invalid syntax

byte-compiling c:\python31\Lib\site-packages\serial\serialwin32.py to serialwin3
2.pyc
byte-compiling c:\python31\Lib\site-packages\serial\sermsdos.py to sermsdos.pyc
byte-compiling c:\python31\Lib\site-packages\serial\socket_connection.py to sock
et_connection.pyc
  File "c:\python31\Lib\site-packages\serial\socket_connection.py", line 49
    except Exception, msg:
                    ^
SyntaxError: invalid syntax

byte-compiling c:\python31\Lib\site-packages\serial\win32.py to win32.pyc
  File "c:\python31\Lib\site-packages\serial\win32.py", line 164
    MAXDWORD = 4294967295L # Variable c_uint
                         ^
SyntaxError: invalid syntax

byte-compiling c:\python31\Lib\site-packages\serial\__init__.py to __init__.pyc
running install_scripts
creating c:\python31\Scripts
copying build\scripts-3.1\miniterm.py -> c:\python31\Scripts
running install_egg_info
Writing c:\python31\Lib\site-packages\pyserial_py3k-2.5-py3.1.egg-info


c:\path\to\pyserial-2.5>

Hmm... looks like I'm using an incorrect version of pyserial. This download page makes it look like 2.5 is the most current. Odd.

Update 2: I went through and fixed all the syntax errors, but started getting import errors. In __init__.py, I changed:

if os.name == 'nt': #sys.platform == 'win32':
    from serialwin32 import *
elif os.name == 'posix':
    from serialposix import *
elif os.name == 'java':
    from serialjava import *

to:

if os.name == 'nt': #sys.platform == 'win32':
    from .serialwin32 import *
elif os.name == 'posix':
    from .serialposix import *
elif os.name == 'java':
    from .serialjava import *

Now I'm getting an error in serialwin32.py:

>>> import serial
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    import serial
  File "C:\Python31\lib\site-packages\serial\__init__.py", line 19, in <module>
    from .serialwin32 import *
  File "C:\Python31\lib\site-packages\serial\serialwin32.py", line 12, in <module>
    import win32
ImportError: No module named win32

I tried doing the .modulename syntax, but that wouldn't compile.

What else can I do here? I'm having a hard time believing that anyone intended this code to run on Python 3. (Perhaps I got the wrong version?)


回答1:


First of all, why are you using python 2.4 on Windows? It is pretty old and things are improved (for e.g. ctypes) and you might need those for pyserial.

Now, coming to your installation question, please don't dabble with PYTHONPATH in order to make the module working for one python version vs. another. Python 3 is backwards incompatible, so you won't get it automatically working for what you install for Python 2.x.

There is a simple set of instructions given in the pyserial website:

Download the archive from http://pypi.python.org/pypi/pyserial. Unpack the archive, enter the pyserial-x.y directory and run:

# This will be suitable for python2.5
python setup.py install


# This is suitable for python3.1
python3 setup.py install

Note that I am using the interpreter python3 in the second case.




回答2:


I had a problem similar to yours when I followed the install instructions from the website. Just like it said, I navigated into the unpacked download folder and ran

# This is suitable for python3.1
python3 setup.py install

However, when I ran import serial, I got a similar syntax error:

>>> import serial
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "serial/__init__.py", line 21, in <module>
    from serial.serialposix import *
  File "serial/serialposix.py", line 58
    except IOError, e:
                  ^
SyntaxError: invalid syntax

It turns out that you just need to leave the install directory. The download folder has a folder named serial that overrides the newly installed serial module.



来源:https://stackoverflow.com/questions/5177041/trouble-with-pyserial-and-multiple-python-installations

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!