876 Stimmen

Fehler: vcvarsall.bat kann nicht gefunden werden

Ich habe versucht, das Python-Paket zu installieren dulwich :

pip install dulwich

Aber ich erhalte eine kryptische Fehlermeldung:

error: Unable to find vcvarsall.bat

Dasselbe passiert, wenn ich versuche, das Paket manuell zu installieren:

> python setup.py install
running build_ext
building 'dulwich._objects' extension
error: Unable to find vcvarsall.bat

7 Stimmen

Für die Zukunft wäre es schön zu sehen, auf welcher Plattform Sie dies verwenden.

0 Stimmen

47 Stimmen

Wenn Sie der Meinung sind, dass dies eine lächerlich kryptische und wenig hilfreiche Fehlermeldung ist, stimmen Sie bitte für den Fehler unter bugs.python.org/issue2943

6voto

Games Brainiac Punkte 75966

Ich habe alle oben genannten Antworten ausprobiert und festgestellt, dass sie alle nicht funktionieren. Das lag vielleicht daran, dass ich Windows 8 verwendete und Visual Studio 2012 installiert hatte. In diesem Fall ist dies, was Sie tun.

Le site vcvarsall.bat Datei befindet sich hier: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC

Wählen Sie einfach die Datei aus, und kopieren Sie sie.

Wechseln Sie dann in dieses Verzeichnis: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools

und fügen Sie die Datei ein. Und dann sollte alles gut sein.

6voto

Eric Smith Punkte 2479

Sie können die kostenlose Visual C++ 2008 Express Edition herunterladen unter http://go.microsoft.com/?linkid=7729279 die bei der Installation die Umgebungsvariable VS90COMNTOOLS setzt und somit einen kompatiblen Compiler erzeugt.

Wie @PiotrDobrogost in einem Kommentar erwähnte, geht seine Antwort auf diese andere Frage im Detail darauf ein, warum Visual C++ 2008 das Richtige ist, um damit zu bauen, aber das kann sich ändern, wenn der Windows-Build von Python zu neueren Versionen von Visual Studio wechselt: Erstellung von lxml für Python 2.7 unter Windows

6voto

neRok Punkte 985

Ich hatte dieses Problem mit Python 3.4.1 unter Windows 7 x64 und leider hatten die Pakete, die ich brauchte, keine passenden Exe oder Räder, die ich verwenden konnte. Dieses System erfordert ein paar "Umgehungen", die im Folgenden beschrieben werden (und TLDR am Ende ).

Unter Verwendung der Informationen in Jaxrtechs Antwort oben Ich stellte fest, dass ich Visual Studio C++ 2010 benötigte (sys.version return MSC v.1600), also installierte ich Visual C++ 2010 Express über den Link in seiner Antwort, der lautet http://go.microsoft.com/?linkid=9709949 . Ich habe alles mit Updates installiert, aber wie Sie unten lesen können, war das ein Fehler. Zu diesem Zeitpunkt sollte nur die Originalversion von Express installiert werden (keine aktualisierten Versionen).

vcvarsall.bat war nun vorhanden, aber es gab einen neuen Fehler bei der Installation des Pakets, query_vcvarsall raise ValueError(str(list(result.keys())))ValueError: [u'path'] . Es gibt andere Stackoverflow-Fragen mit diesem Fehler, wie zum Beispiel Fehler bei der Erstellung/Installation des C-Moduls für Python 2.7

Dieser Antwort habe ich entnommen, dass 2010 Express nur 32-Bit-Compiler installiert. Um 64-Bit-Compiler (und andere Compiler) zu erhalten, müssen Sie das Windows 7.1 SDK installieren. Siehe http://msdn.microsoft.com/en-us/windowsserver/bb980924.aspx

Bei mir ließ sich das Programm jedoch nicht installieren, und das Installationsprogramm gab die folgende Fehlermeldung aus installation failed with return code 5100 . Ich habe die Lösung unter dem folgenden Link gefunden: http://support.microsoft.com/kb/2717426 . Kurz gesagt, wenn neuere Versionen von x86 und x64 Microsoft Visual C++ 2010 Redistributable installiert sind, geraten sie in Konflikt mit den Versionen im SDK-Installationsprogramm und müssen zuerst deinstalliert werden.

Das SDK wurde dann installiert, aber ich stellte fest, dass vcvars64.bat immer noch nicht in C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin noch seine Unterordner. vcvarsall.bat führt die Batchdatei vcvars64 aus, ohne die das Python-Paket immer noch nicht installiert werden kann (ich habe die Fehlermeldung vergessen, die zu diesem Zeitpunkt angezeigt wurde).

Ich habe dann hier eine Anleitung gefunden: http://www.cryptohaze.com/wiki/index.php/Windows_7_Build_Setup#Download_VS_2010_and_Windows_SDK_7.1 Den Anweisungen folgend, hatte ich bereits Express und 7.1 SDK installiert, also installierte ich SDK 7.1 SP1 und führte die Korrektur der fehlenden Header-Datei durch. Dann erstellte ich manuell vcvars64.bat mit folgendem Inhalt CALL setenv /x64 . Ich werde alle diese Anweisungen hier einfügen, damit sie nicht verloren gehen.

Schritt 1 ist der Download von Visual Studio Express 2010.

http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express ist eine gute Anlaufstelle. Laden Sie das Installationsprogramm herunter, und führen Sie es aus (vc_web.exe). Sie brauchen den zusätzlichen SQL 2008-Download nicht.

Sie benötigen außerdem das Windows SDK (derzeit 7.1) für die 64-Bit Compiler - es sei denn, Sie wollen nur 32-Bit-Builds machen, die nicht vollständig unterstützt werden...

http://www.microsoft.com/en-us/download/details.aspx?id=8279 ist eine gute Ausgangspunkt für den Download - Sie sollten winsdk_web.exe ausführen nach dem Herunterladen ausführen!

Die Standardinstallation hier ist in Ordnung.

Laden Sie schließlich das Windows SDK 7.1 SP1 Update herunter und installieren Sie es: http://www.microsoft.com/en-us/download/details.aspx?id=4422

Und, um fehlende Header-Datei zu beheben, VS2010 SP1. http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=75568aa6-8107-475d-948a-ef22627e57a5

Und, verdammt noch mal, beheben Sie die fehlende Batch-Datei für VS2010 Express. Diese wird geradezu absurd.

En C:\Program Dateien (x86) \Microsoft Visual Studio 10.0 \VC\bin\amd64 , Erstellen Sie "vcvars64.bat" mit folgendem Inhalt (Sie müssen als Administrator ausgeführt werden als Administrator ausführen):

CALL setenv /x64

Mein Python-Paket ließ sich immer noch nicht installieren (ich kann mich nicht an den Fehler erinnern). Ich fand dann einige Anweisungen (unten kopiert), um die spezielle SDK 7.1 Eingabeaufforderung zu verwenden, siehe: https://mail.python.org/pipermail/distutils-sig/2012-February/018300.html

Vergessen Sie diese Frage. Jemandem hier ist dieser Punkt im Menü aufgefallen: Start->Alle Programme->Microsoft Windows SDK v7.1 ->Windows SDK 7.1 Eingabeaufforderung

Damit wird ein Batch-Job ausgeführt, der eine Arbeitsumgebung für den Compiler einzurichten scheint. An dieser Eingabeaufforderung können Sie "setup.py build" oder "setup.py install" eingeben.

Ich öffnete die Windows SDK 7.1 Eingabeaufforderung wie angewiesen und führte easy_install für das Python-Paket aus. Und endlich: Erfolg!


TLDR ;

  1. Installieren Sie Visual Studio Express 2010 (vorzugsweise ohne aktualisierte Redistributables oder SQL Server).
  2. Windows 7.1 SDK installieren
  3. Installieren Sie das SDK 7.1 SP1-Update und den VS2010 SP1-Header-Fix (dieser Schritt ist möglicherweise nicht erforderlich).
  4. Manuell erstellen C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vcvars64.bat mit Inhalt CALL setenv /x64
  5. Start->Alle Programme->Microsoft Windows SDK v7.1 ->Windows SDK 7.1 Eingabeaufforderung, um eine spezielle x64-Eingabeaufforderung zu öffnen, die dann mit python/easy_install/pip/etc (einschließlich derer in virtual_envs) verwendet werden kann.

4voto

Riyas Deen Punkte 111

Die folgenden Schritte haben dieses Problem für mich behoben. Ich habe versucht, ein Setup mit der Cython-Erweiterung zu erstellen.

  1. Microsoft Visual C++ Compiler für Python 2.7 installieren
  2. Der Standard-Installationsort ist @ C:\Users\PC -Benutzer \AppData\Local\Programs\Common\Microsoft\Visual C++ für Python Dies könnte das Problem tatsächlich beheben, testen Sie einmal, bevor Sie fortfahren.
  3. Wenn es fehlschlägt, prüfen Sie, wo in VC++ für Python die Datei vcvarsall.bat befindet
  4. Öffnen Sie die Datei msvc9compiler.py des Pakets distutils in Notepad.
  5. In meiner Box war dies @ C:\Anaconda2\Lib\distutils\msvc9compiler.py Funktion find_vcvarsall in dieser Datei, ermittelt die Version von VC, indem sie das Argument version Argument. Für Python 2.7 wird es wahrscheinlich 9.0 sein.
  6. Erstellen Sie nun eine Umgebungsvariable VS90COMNTOOLS an, die auf C:\Users\PC -Benutzer \AppData\Local\Programs\Common\Microsoft\Visual C++ für Python \9.0\VC\bin
  7. Aus irgendeinem Grund erwartet distutils die vcvarsall.bat Datei im VC-Verzeichnis, aber VC++ für Python Tools hat sie in der Root von 9.0 Um dies zu beheben, entfernen Sie "VC" aus der path.join (ungefähr um Zeile 247)

    #productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC") productdir = os.path.join(toolsdir, os.pardir, os.pardir)

Die oben genannten Schritte haben das Problem bei mir behoben.

4voto

user2682863 Punkte 2917

Aufrufen import setuptools wird distutils zum Affen machen, um die Kompatibilität mit Visual Studio zu erzwingen. Aufruf von vcvars32.bat wird die virtuelle Umgebung manuell eingerichtet und verhindert andere häufige Fehler, die der Compiler auslöst. Für VS 2017 befindet sich die Datei unter

" C:\Program Dateien (x86) \Microsoft Visuell Studio \2017\Community\VC\Auxiliary\Build\vcvars32.bat "

Hier ist das Setup-Skript, das ich verwende, um .pyx-Dateien schnell zu .pyd zu kompilieren: (Hinweis: Es verwendet das Modul eines Drittanbieters send2trash

# cython_setup.py
import sys, os, time, platform, subprocess
from setuptools import setup, find_packages
from Cython.Build import cythonize
from traceback import format_exc

# USAGE:
#
#   from cython_setup import run
#   run(pyx_path)

# vcvars = r"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"

# NOTE: to use visual studio 2017 you must have setuptools version 34+
vcvars = r"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars32.bat"

def _build_ext():
    try:
        pyx_path = sys.argv.pop(-1)
        pyx_path = os.path.abspath(pyx_path)
        if not os.path.exists(pyx_path):
            raise FileNotFoundError(f"{pyx_path} does not exist")
        project_name = sys.argv.pop(-1)
        os.chdir(os.path.abspath(os.path.dirname(pyx_path)))

        print("cwd: %s" % os.getcwd())
        print(os.path.abspath("build"))
        setup(
            name=project_name,
            # cmdclass = {'build_ext': build_ext},
            packages=find_packages(),
            # ext_modules=cythonize(extensions)
            ext_modules=cythonize(pyx_path,
                                  compiler_directives={'language_level': 3, 'infer_types': True, 'binding': False},
                                  annotate=True),
            # include_dirs = [numpy.get_include()]
            build_dir=os.path.abspath("build")
        )
    except:
        input(format_exc())

def retry(func):
    def wrapper(*args, **kw):
        tries = 0
        while True:
            try:
                return func(*args, **kw)
            except Exception:
                tries += 1
                if tries > 4:
                    raise
                time.sleep(0.4)

    return wrapper

@retry
def cleanup(pyx_path):
    from send2trash import send2trash
    c_file = os.path.splitext(pyx_path)[0] + ".c"
    if os.path.exists(c_file):
        os.remove(c_file)

    if os.path.exists("build"):
        send2trash("build")

def move_pyd_files(pyx_path):
    pyx_dir = os.path.dirname(pyx_path)
    build_dir = os.path.join(pyx_dir, "build")
    if not os.path.exists(build_dir):
        raise RuntimeError(f"build_dir {build_dir} did not exist....")
    found_pyd = False
    for top, dirs, nondirs in os.walk(build_dir):
        for name in nondirs:
            if name.lower().endswith(".pyd") or name.lower().endswith(".so"):
                found_pyd = True
                old_path = os.path.join(top, name)
                new_path = os.path.join(pyx_dir, name)
                if os.path.exists(new_path):
                    print(f"removing {new_path}")
                    os.remove(new_path)
                print(f"file created at {new_path}")
                os.rename(old_path, new_path)
    if not found_pyd:
        raise RuntimeError("Never found .pyd file to move")

def run(pyx_path):
    """
    :param pyx_path:
    :type pyx_path:
    :return: this function creates the batch file, which in turn calls this module, which calls cythonize, once done
    the batch script deletes itself... I'm sure theres a less convoluted way of doing this, but it works
    :rtype:
    """
    try:
        project_name = os.path.splitext(os.path.basename(pyx_path))[0]
        run_script(project_name, os.path.abspath(pyx_path))
    except:
        input(format_exc())

def run_script(project_name, pyx_path):
    dirname = os.path.dirname(pyx_path)
    # ------------------------------
    os.chdir(dirname)
    if os.path.exists(vcvars):
        #  raise RuntimeError(
        # f"Could not find vcvars32.bat at {vcvars}\nis Visual Studio Installed?\nIs setuptools version > 34?")
        subprocess.check_call(f'call "{vcvars}"', shell=True)

    cmd = "python" if platform.system() == "Windows" else "python3"
    subprocess.check_call(f'{cmd} "{__file__}" build_ext "{project_name}" "{pyx_path}"', shell=True)
    move_pyd_files(pyx_path)
    cleanup(pyx_path)

if len(sys.argv) > 2:
    _build_ext()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X