2015-12-07 6 views
11

Я пытаюсь запустить некоторый код с Python 3.5 в Windows 10 с использованием cygwin (mingw). Чтобы быть точным, я использую модуль PyDSTool, где я называю интегратор допри. Проблема в том, что у меня возникают проблемы с distutils, не признающим Microsoft Visual Studio 2015. Есть ли способ избежать этого (не возвращаясь к более старым версиям Python, Windows, Visual Studio). Полную ошибку можно увидеть ниже.ValueError: Неизвестный MS Compiler version 1900

ValueError        Traceback (most recent call last) 
<ipython-input-16-bfeb915bfd7b> in <module>() 
    60 print("\n") 
    61 
---> 62 testODE = Dopri_ODEsystem(DSargs) 
    63 
    64 print('Integrating...') 

C:\Anaconda3\lib\site-packages\PyDSTool\Generator\Dopri_ODEsystem.py in __init__(self, kw) 
    371    print("stages using the makeLibSource and compileLib methods.") 
    372   else: 
--> 373    self.makeLib() 
    374 
    375  @property 

C:\Anaconda3\lib\site-packages\PyDSTool\Generator\mixins.py in makeLib(self, libsources, libdirs, include) 
    98    self.forceLibRefresh() 
    99   self.makeLibSource(include) 
--> 100   self.compileLib(libsources, libdirs) 
    101 
    102  @property 

C:\Anaconda3\lib\site-packages\PyDSTool\Generator\mixins.py in compileLib(self, libsources, libdirs) 
    78   precompiled libraries.""" 
    79 
---> 80   self._builder.build(libsources, libdirs, self._compiler) 
    81 
    82  def forceLibRefresh(self): 

C:\Anaconda3\lib\site-packages\PyDSTool\Generator\mixins.py in build(self, libsources, libdirs, compiler) 
    187     script_args=script_args, 
    188     ext_modules=[extmod], 
--> 189     py_modules=[self.modname]) 
    190 
    191  def save_vfield(self, code, fname=None): 

C:\Anaconda3\lib\site-packages\numpy\distutils\core.py in setup(**attr) 
    167  new_attr['distclass'] = NumpyDistribution 
    168 
--> 169  return old_setup(**new_attr) 
    170 
    171 def _check_append_library(libraries, item): 

C:\Anaconda3\lib\distutils\core.py in setup(**attrs) 
    146  if ok: 
    147   try: 
--> 148    dist.run_commands() 
    149   except KeyboardInterrupt: 
    150    raise SystemExit("interrupted") 

C:\Anaconda3\lib\distutils\dist.py in run_commands(self) 
    953   """ 
    954   for cmd in self.commands: 
--> 955    self.run_command(cmd) 
    956 
    957  # -- Methods that operate on its Commands -------------------------- 

C:\Anaconda3\lib\distutils\dist.py in run_command(self, command) 
    972   cmd_obj = self.get_command_obj(command) 
    973   cmd_obj.ensure_finalized() 
--> 974   cmd_obj.run() 
    975   self.have_run[command] = 1 
    976 

C:\Anaconda3\lib\site-packages\numpy\distutils\command\build_ext.py in run(self) 
    115          verbose=self.verbose, 
    116          dry_run=self.dry_run, 
--> 117          force=self.force) 
    118   self.compiler.customize(self.distribution) 
    119   self.compiler.customize_cmd(self) 

C:\Anaconda3\lib\site-packages\numpy\distutils\ccompiler.py in new_compiler(plat, compiler, verbose, dry_run, force) 
    594   raise DistutilsModuleError(("can't compile C/C++ code: unable to find class '%s' " + 
    595    "in module '%s'") % (class_name, module_name)) 
--> 596  compiler = klass(None, dry_run, force) 
    597  log.debug('new_compiler returns %s' % (klass)) 
    598  return compiler 

C:\Anaconda3\lib\site-packages\numpy\distutils\mingw32ccompiler.py in __init__(self, verbose, dry_run, force) 
    56 
    57   distutils.cygwinccompiler.CygwinCCompiler.__init__ (self, verbose, 
---> 58                dry_run, force) 
    59 
    60   # we need to support 3.2 which doesn't match the standard 

C:\Anaconda3\lib\distutils\cygwinccompiler.py in __init__(self, verbose, dry_run, force) 
    159    # Include the appropriate MSVC runtime library if Python was built 
    160    # with MSVC 7.0 or later. 
--> 161    self.dll_libraries = get_msvcr() 
    162 
    163  def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): 

C:\Anaconda3\lib\distutils\cygwinccompiler.py in get_msvcr() 
    88   #  return ['vcruntime140'] 
    89   else: 
---> 90    raise ValueError("Unknown MS Compiler version %s " % msc_ver) 
    91 
    92 

ValueError: Unknown MS Compiler version 1900 

ответ

8

Distutils и Numpy/Distutils в настоящее время не имеют поддержки для Visual Studio 2015, Visual C++ 14. Эти советы, извлеченные из ошибки Python report, я был в состоянии исправить необходимые файлы и успешно построить расширение с помощью нового установить Python 3.5 из Anaconda и Mingw64 с GCC 5.2.0, работающим в MSYS2 в Windows 7. У меня нет установленной Visual Studio. Решение заключалось в том, чтобы исправить один файл distutils и два файла numpy/distutils (если это применимо). Эти исправления были представлены для включения в будущие изменения.

Вы можете применить патчи сами быстро исправить:

UPDATE

Пожалуйста, обратите внимание, что в то время как вышеуказанные участки работал для меня, он не был принят для включения в восходящий поток. Изменения, которые произошли с VS 2015, более сложны, чем я оценил.

6

Я столкнулся с той же проблемой и выяснил, что проблема связана с компилятором mingw. Я попробовал заплатки, предложенные @tharen, но это не сработало для меня.

Кажется, что любимый компилятор cygwin для Windows - это визуальный C++, поэтому я загрузил только визуальные инструменты для сборки C++ с http://landinghub.visualstudio.com/visual-cpp-build-tools , а затем он отлично работал.

Обратите внимание, что вам необходимо удалить mingw и все ссылки на него, которые вы включили в свой проект. В частности, мне пришлось удалить distutils.cfg файл, который я создал, который имел указывающий следующий код MinGW

[build] 
compiler = mingw32 
1

Я только что сделал он следующие изменения и он работал как шарм!

Редактировать файл distutils.cfg присутствует в местах:

  1. C: \ Users \\ AppData \ Local \ Continuum \ Anaconda3 \ Lib \ Distutils \
  2. C: \ Users \\ AppData \ Local \ Континуум \ Anaconda3 \ pkgs \ libpython-2,0-py36_0 \ Lib \ Distutils

Изменить содержание distutils.cfg в:

[build] 
compiler=g++ 

[build_ext]   
compiler=g++ 

P.S. Вероятно, изменение только во 2-м месте также должно быть выполнено.

P.P.S Убедитесь, что gcc установлен и находится в PATH.Для меня был установлен TDM-GCC-64

7

Я внесла следующие изменения, и это сработало для меня со следующими конфигурациями.

  • ОС: Win 7 SP1 проф 64 бит
  • CPython 3.6, 64 бит
  • Mingw 64 (x86_64-7.1.0-POSIX-SEH-rt_v5-rev0)
  • Cython 0.25.2

я сделал следующее

  1. Добавить MinGW в переменной PATH (C:\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin для меня)
  2. Test путем открытия командной строки и команды gcc работы (у меня нет других компиляторов)
  3. Создание distutils.cfg в C:\Python36\Lib\distutils
  4. Добавление строк в этом файле:

    [build] 
    compiler = mingw32 
    
  5. Ручное применение this patch

  6. Ручная загрузка файла vcruntime140.dll и помещение его в C:\Python36\libs
+0

Evrything работал отлично этот путь, пока я не нашел, что MingW w64 определяет "hypot = hypot" и в pyconfig.h, она определяется как "hypot = _hypot". Следовательно, генерация ошибок компилятора в некоторых случаях. Исправление: 1) Либо временно отредактируйте pyconfig.h, указав строку «#define hypot _hypot» на «#define hypot hypot», а затем запустите процесс cython. 2) В setup.py добавьте новый параметр в "ext = Extension (" ... ", .., .., extra_compile_args = ['...', '-D_hypot = hypot', '..']) «... Эта проблема возникает, когда компиляция C++ с кодом Cython появляется. –

+0

Я могу подтвердить, что это работает на Windows 10 с Anaconda 3 –

+1

Если вы не можете заставить его работать, то дайте компилятору = mingw32.exe попробовать также - он работал для меня, а компилятор = mingw32 этого не делал. – plunntic

4

Если кто-нибудь еще есть эта проблема, я просто в него врезался при установке yowsup и питон-аксолотль, это то, что я сделал, чтобы решить:

-Примените патч от Tharen в питона cygwinccompiler .py файл (находится в папке установки питона) https://bugs.python.org/file40608/patch.diff

2-с MinGW, установите pexports, откройте терминал в режиме администратора и введите:

mingw-get install pexports 

2-к питона INSTAL л папка, в моем случае это C: \ Program Files (x86) \ Python36-32

еще в том же терминале мы использовали для установки pexports, после того, как перейти на питон установку папки выполните следующее:

pexports vcruntime140.dll >libs\vcruntime140.def 
dlltool -dllname vcruntime140.dll --def libs\vcruntime140.def --output-lib libs\libvcruntime140.a 

Затем вернитесь в папку, в которой вы устанавливали библиотеку, или что бы вы ни делали раньше, теперь она должна работать.

Кстати, не забудьте добавить

[build] 
compiler = mingw32 

в файле Distutils.

Источник: это собственное сообщение и https://bugs.python.org/issue25251

+0

' pexports' является 'gendef' в mingw-w64-i686-tools или mingw-w64-x86_64-tools в msys2. – Mithril

0

Подробности в link помогли мне решить эту проблему как шарм.

Просто прокомментировал get_msvcr() в cygwinccompiler.py.

(вспомните свой комментарий else также)