2015-12-07 74 views
11

Sto cercando di eseguire codice con Python 3.5 su Windows 10 con l'utilizzo di cygwin (mingw). Per la precisione sto usando il modulo PyDSTool, dove chiamo l'integratore dopri. Il problema è che ho problemi con distutils che non riconosce Microsoft Visual Studio 2015. C'è un modo per evitarlo (senza tornare alle versioni precedenti di Python, Windows, Visual Studio). L'errore completo può essere visto sotto.ValueError: Unknown MS Compiler versione 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 

risposta

8

Distutils e Numpy/Distutils attualmente non hanno il supporto per Visual Studio 2015, Visual C++ 14. seguenti suggerimenti tratti dalla Python bug report, sono stato in grado di correggere i file necessari e con successo costruire estensione utilizzando una nuova installazione di Python 3.5 da Anaconda e Mingw64 con GCC 5.2.0 in esecuzione su MSYS2 su Windows 7. Non ho installato Visual Studio. La soluzione consisteva nel patchare un file distutils e due file numpy/distutils (se questo si applica). Queste patch sono state presentate per l'inclusione in future revisioni.

È possibile applicare le patch da soli per una soluzione rapida:

UPDATE

Si prega di notare che mentre le patch di cui sopra ha funzionato per me non è stato accettato per l'inclusione in upstream. I cambiamenti che sono venuti con VS 2015 sono più complessi di quanto ho apprezzato.

6

Ero in esecuzione sullo stesso problema e ho capito che il problema era con il compilatore mingw. Ho provato le patch suggerite da @tharen ma non ha funzionato per me.

Sembra che il compilatore preferito di cygwin per Windows sia il visual C++, quindi ho scaricato solo gli strumenti di creazione vis C++ da http://landinghub.visualstudio.com/visual-cpp-build-tools e quindi ha funzionato correttamente.

Nota che è necessario disinstallare mingw e tutti i riferimenti ad esso inclusi nel progetto. In particolare, ho dovuto eliminare un file distutils.cfg che avevo creato, che ha avuto il seguente codice punta al MinGW

[build] 
compiler = mingw32 
1

Ho appena fatto lui seguenti modifiche e ha funzionato come un fascino!

Modifica distutils.cfg di file presenti in luoghi:

  1. C: \ Users \\ AppData \ Local \ Continuum \ Anaconda3 \ Lib \ distutils \
  2. C: \ Users \\ AppData \ Local \ Continuum \ Anaconda3 \ pkgs \ libpython-2.0-py36_0 \ lib \ distutils

modificare il contenuto di distutils.cfg a:

[build] 
compiler=g++ 

[build_ext]   
compiler=g++ 

P.S. Probabilmente cambierebbe anche solo in 2a posizione.

P.P.S Assicurarsi che gcc sia installato ed è in PERCORSO.Per me è stato installato TDM-GCC-64

7

Ho apportato le seguenti modifiche e ha funzionato per me con le seguenti configurazioni.

  • OS: Win 7 Prof. SP1 a 64 bit
  • CPython 3.6, 64 bit
  • Mingw 64 (x86_64-7.1.0-posix-seh-rt_v5-rev0)
  • Cython 0.25.2

ho fatto la seguente

  1. Add mingw nella variabile PATH (C:\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin per me)
  2. test con l'apertura della linea di comando e di comando gcc opere (non ho altri compilatori)
  3. Creare distutils.cfg in C:\Python36\Lib\distutils
  4. Aggiungi righe in quel file:

    [build] 
    compiler = mingw32 
    
  5. applicare manualmente this patch

  6. Scaricare manualmente il file vcruntime140.dll e inserirlo in C:\Python36\libs
+0

Evrything ha funzionato bene in questo modo fino a quando ho scoperto che MingW W64 definisce "hypot = hypot" e in pyconfig.h, è definito come "hypot = _hypot". Quindi genera errori del compilatore in alcuni casi. La correzione è: 1) Modificare temporaneamente pyconfig.h con la linea "#define hypot _hypot" su "#define hypot hypot", quindi eseguire il processo cython. 2) In setup.py, aggiungi un nuovo parametro a "ext = Extension (" ... ", .., .., extra_compile_args = ['...', '-D_hypot = hypot', '..']) "... Questo problema si verifica in particolare quando c'è una compilazione C++ con il codice Cython, appare. –

+0

Posso confermare che funziona su Windows 10 con Anaconda 3 –

+1

Se non riesci a farlo funzionare, prova anche a compilatore = mingw32.exe - ha funzionato per me, mentre il compilatore = mingw32 no. – plunntic

4

Se qualcuno ha ancora questo problema, ho appena eseguito in esso durante l'installazione yowsup e python-Axolotl, questo è quello che ho fatto per risolverlo:

1- applicare la patch dal Tharen in cygwinccompiler pitone il file .py (che si trova nella cartella di installazione di Python) https://bugs.python.org/file40608/patch.diff

2-Con minGW, installare PExports, aprire un terminale in modalità amministratore e digitare:

mingw-get install pexports 

2-Vai installare python l cartelle, nel mio caso è stato C: \ Program Files (x86) \ Python36-32

ancora nello stesso terminale che abbiamo usato per l'installazione PExports, dopo la navigazione verso il pitone cartella di installazione eseguire il seguente:

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

Quindi tornare alla cartella in cui si stava installando la libreria, o qualsiasi cosa stavate facendo prima, dovrebbe funzionare ora.

btw, non dimenticate di aggiungere

[build] 
compiler = mingw32 

nel file distutils.

Fonte: questo post proprio e https://bugs.python.org/issue25251

+0

' pexports' è 'gendef' in mingw-w64-i686-tools o mingw-w64-x86_64-tools sotto msys2. – Mithril

0

dettagli in link aiutato a risolvere questo come un fascino.

Appena commentato get_msvcr() in cygwinccompiler.py.

(ricordate di commentare la else anche)