Код Python запускается в интерактивном режиме, но не как скрипт
Я пытаюсь взаимодействовать с океанским оптическим спектрометром с помощью морского бриза ( seabreeze) и pyseabreeze ( pyseabreeze).
Если я введу python из командной строки (cmd) в Windows и введу следующий код построчно, это будет работать. Однако, если я помещу его в скрипт (spec_test.py) и попытаюсь запустить его из cmd.exe с помощью python spec_test.py, это не сработает.
Я много раз искал похожие проблемы, но, похоже, ни одна из них не покрывала проблему, с которой я столкнулся. Я использую 64-битную Windows 7, Python 3.5.2, установленный с помощью Anaconda. Мне также пришлось установить pyusb и libusb, чтобы использовать pyseabreeze.
Код:
import seabreeze
seabreeze.use('pyseabreeze')
import seabreeze.spectrometers as sb
devs = sb.list_devices()
print(devs)
spec = sb.Spectrometer(devs[0])
print(spec.model)
и сообщение об ошибке я получаю:
[<SeaBreezeDevice USB2000PLUS:FLMS02379>]
Traceback (most recent call last):
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\seabreeze\pyseabreeze\interfaces\common.py", line 14, in decorated_func
return func(*args, **kwargs)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\seabreeze\pyseabreeze\interfaces\spectrometer.py", line 46, in open
self.open_device(device.handle)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\seabreeze\pyseabreeze\interfaces\communication.py", line 37, in open_device
device.set_configuration()
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\usb\core.py", line 869, in set_configuration
self._ctx.managed_set_configuration(self, configuration)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\usb\core.py", line 102, in wrapper
return f(self, *args, **kwargs)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\usb\core.py", line 148, in managed_set_configuration
self.backend.set_configuration(self.handle, cfg.bConfigurationValue)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\usb\backend\libusb0.py", line 493, in set_configuration
_check(_lib.usb_set_configuration(dev_handle, config_value))
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\usb\backend\libusb0.py", line 431, in _check
raise USBError(errmsg, ret)
usb.core.USBError: [Errno None] b'libusb0-dll:err [set_configuration] could not set config 1: win error: The parameter is incorrect.\r\n'
Traceback (most recent call last):
File "<ipython-input-9-ead886eb3666>", line 1, in <module>
runfile('C:/Users/Raman Lab/Python code/Spectrometers/spec_testing.py', wdir='C:/Users/Raman Lab/Python code/Spectrometers')
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
execfile(filename, namespace)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/Raman Lab/Python code/Spectrometers/spec_testing.py", line 7, in <module>
spec = sb.Spectrometer(devs[0])
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\seabreeze\spectrometers.py", line 62, in __init__
self._open_device(device)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\seabreeze\spectrometers.py", line 90, in _open_device
lib.device_open(self._dev)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\seabreeze\pyseabreeze\wrapper.py", line 81, in device_open
return device.interface.open(device)
File "C:\Users\Raman Lab\AppData\Local\Continuum\Anaconda3\lib\site-packages\seabreeze\pyseabreeze\interfaces\common.py", line 23, in decorated_func
raise SeaBreezeError(msg)
SeaBreezeError: An error occured during opening.
Спасибо за любую помощь!
Изменить: По какой-то причине я понял это, подумал, что это может помочь описать проблему. Если я ввожу интерактивный python из cmd.exe и вставляю код вместо того, чтобы вводить его вручную, я получаю ту же ошибку. Это заставляет меня думать (скорее всего, я не прав), что это как-то связано со скоростью импорта. Я пытался добавить сон на несколько секунд между строками 3 и 5, чтобы смоделировать, что происходит, когда я печатаю в подсказке, но это не помогло. Я надеюсь, что это было достаточно наглядно.
1 ответ
Ваше первоначальное предположение было не за горами. У меня была точно такая же проблема на Windows 7 32bit с Python 2.7. Пример кода, с которым связан gchaks, работает нормально. Когда я попытался выполнить скрипт несколько раз подряд, сообщение об ошибке изменилось и указало на пустой список устройств. Я добавил задержку в 2 секунды после
devs = sb.list_devices()
и это решило проблему. Ваш код прекрасно работал на машине с Linux, кстати.
Еще один совет: если ваш код должен запускаться один раз, но затем вы столкнетесь с другим сообщением об ошибке, убедитесь, что вы закрыли соединение с устройством или отключили и снова подключили спектрометр.