Ich versuche, etwas Code mit Python 3.5 unter Windows 10 unter Verwendung von cygwin (mingw) auszuführen. Um genau zu sein, verwende ich das PyDSTool-Modul, in dem ich den Dopri-Integrator nenne. Das Problem ist, ich habe Probleme mit distutils
, das Microsoft Visual Studio 2015 nicht erkennt. Gibt es eine Möglichkeit, dies zu vermeiden (ohne auf ältere Versionen von Python, Windows, Visual Studio zurückzugreifen). Der vollständige Fehler ist unten zu sehen.
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
Ich habe die folgenden Änderungen vorgenommen und es hat bei den folgenden Konfigurationen für mich funktioniert.
Ich habe folgendes getan
C:\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin
für mich).gcc
funktioniert (ich habe keine anderen Compiler)distutils.cfg
in C:\Python36\Lib\distutils
Zeilen in dieser Datei hinzufügen:
[build]
compiler = mingw32
vcruntime140.dll
und Einfügen in C:\Python36\libs
Distutils und Numpy/Distutils bieten derzeit keine Unterstützung für Visual Studio 2015, Visual C++ 14. Mit den folgenden Tipps aus dem Python-Fehler report konnte ich die erforderlichen Dateien patchen und mit einer neuen Installation von Python erfolgreich Erweiterungen erstellen 3.5 von Anaconda und Mingw64 mit GCC 5.2.0 in MSYS2 unter Windows 7 ausgeführt. Ich habe kein Visual Studio installiert. Die Lösung bestand darin, eine distutils-Datei und zwei numpy/distutils-Dateien zu patchen (falls zutreffend). Diese Patches wurden zur Aufnahme in zukünftige Versionen eingereicht.
Sie können die Patches für eine schnelle Lösung selbst anwenden:
UPDATE
Bitte beachten Sie, dass die obigen Patches für mich funktionierten, jedoch nicht für die Aufnahme in Upstream akzeptiert wurden. Die Änderungen, die mit VS 2015 einhergingen, sind komplexer als ich schätzte.
Ich bin auf das gleiche Problem gestoßen und habe herausgefunden, dass das Problem beim mingw-Compiler lag. Ich habe die von @tharen vorgeschlagenen Patches ausprobiert, aber es funktionierte nicht für mich.
Cygwins beliebtester Compiler für Windows scheint das Visual C++ zu sein. Ich habe also nur die Visual C++ Build-Tools von http://landinghub.visualstudio.com/visual-cpp-build-tools Heruntergeladen. Dann hat es funktioniert fein.
Beachten Sie, dass Sie mingw und alle in Ihrem Projekt enthaltenen Verweise darauf deinstallieren müssen. Insbesondere musste ich eine distutils.cfg -Datei löschen, die ich erstellt hatte, wobei der folgende Code auf mingw zeigte
[build]
compiler = mingw32
Wenn jemand dieses Problem immer noch hat, bin ich bei der Installation von yowsup und python-axolotl nur darauf gestoßen. Das habe ich getan, um es zu lösen:
1- Übernehmen Sie den Patch von Tharen in der Datei python cygwinccompiler.py (in Ihrem Python-Installationsordner) https://bugs.python.org/file40608/patch.diff
2-Installieren Sie mit mingw pexports, öffnen Sie ein Terminal im Administratormodus und geben Sie Folgendes ein:
mingw-get install pexports
2-Wechseln Sie in den Python-Installationsordner. In meinem Fall war dies C:\Programme (x86)\Python36-32
wir befanden uns noch im selben Terminal, um pexports zu installieren. Nachdem Sie zum Python-Installationsordner navigiert waren, führen Sie Folgendes aus:
pexports vcruntime140.dll >libs\vcruntime140.def
dlltool -dllname vcruntime140.dll --def libs\vcruntime140.def --output-lib libs\libvcruntime140.a
Gehen Sie dann zurück in den Ordner, in dem Sie die Bibliothek installiert haben, oder was auch immer Sie zuvor getan haben. Jetzt sollte es funktionieren.
Übrigens, vergessen Sie nicht hinzuzufügen
[build]
compiler = mingw32
in der distutils-Datei.
Quelle: eigener Beitrag und https://bugs.python.org/issue25251
Ich habe gerade gemacht, dass er den Änderungen folgte und es funktionierte wie ein Zauber!
Bearbeiten Sie die Datei distutils.cfg an Orten:
Ändern Sie den Inhalt von distutils.cfg in:
[build]
compiler=g++
[build_ext]
compiler=g++
P.S. Wahrscheinlich sollte auch nur der 2. Standort geändert werden.
P. P. Stellen Sie sicher, dass gcc installiert ist und sich in PATH befindet. Für mich wurde TDM-GCC-64 installiert
Details in link haben mir geholfen, das wie ein Zauber zu lösen.
Kommentiert get_msvcr()
in cygwinccompiler.py.
(Denken Sie auch daran, das else
zu kommentieren)