我尝试安装Python包dulwich:

pip install dulwich

但我收到了一条神秘的错误消息:

error: Unable to find vcvarsall.bat

如果我尝试手动安装软件包,也会发生同样的情况:

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

当前回答

http://www.stickpeople.com/projects/python/win-psycopg/

从上面的链接安装适当的文件修复了我的问题。

提及:Jason Erickson[jerickso@stickpeople.com]. 他为Windows用户管理这个页面相当好。

其他回答

以下步骤为我解决了这个问题,我正尝试使用cython扩展创建设置。

安装Microsoft Visual C++编译器Python 2.7版默认安装位置为@C: \Users\PC user\AppData\Local\Programs\Common\Microsoft\Visual C++对于Python这实际上可能会解决问题,请在继续之前测试一次。如果失败,请检查VC中的位置++对于python,vcvarsall.bat文件位于打开msvc9compiler.py记事本中distutils包的文件。在我的箱子里@C: \Anaconda2\Lib\distutils\msvc9compiler.py find_vcvarsall函数在此文件中,通过打印版本来确定VC的版本论点对于Python 2.7,可能是9.0现在创建一个环境变量VS90COMNTOOLS,指向C: \Users\PC user\AppData\Local\Programs\Common\Microsoft\Visual C++用于Python\9.0\VC\bin出于某种原因,distutils期望vcvarsall.bat文件应位于VCdir中,但对于python工具则为VC++它位于9.0的根目录中。要解决此问题,请从path.join(大致围绕第247行)#productdir=os.path.join(toolsdir,os.pardir,os.pardir,“VC”)productdir=os.path.join(toolsdir,os.pardir,os.pardir)

以上步骤为我解决了问题。

我在Windows 7 x64上使用Python 3.4.1时遇到了这个问题,不幸的是,我需要的软件包没有适合我使用的exe或轮子。该系统需要一些“变通方法”,具体如下(TLDR位于底部)。

使用Jaxrtech上面的答案中的信息,我确定我需要Visual Studio C++2010(sys.version return MSC v.1600),所以我从他的答案中的链接安装了Visual C++2010 Express,这是http://go.microsoft.com/?linkid=9709949.我安装了所有的更新,但正如你在下面看到的,这是一个错误。此时只应安装Express的原始版本(没有更新任何内容)。

vcvarsall.bat现在存在,但在安装包时出现了一个新错误,query_vcvarsall引发ValueError(str(list(result.keys()))ValueError:[u'path']。还有其他与此错误相关的stackerflow问题,例如为Python 2.7构建/安装C模块时出错

根据这个答案,我确定2010 Express只安装32位编译器。要获得64位(和其他)编译器,您需要安装Windows 7.1 SDK。看见http://msdn.microsoft.com/en-us/windowsserver/bb980924.aspx

但这不会为我安装,安装程序返回错误安装失败,返回代码5100。我在以下链接找到了解决方案:http://support.microsoft.com/kb/2717426.简而言之,如果安装了更新版本的x86和x64 Microsoft Visual C++2010 Redistributable,它们将与SDK安装程序中的版本冲突,需要首先卸载。

然后安装了SDK,但我注意到vcvars64.bat仍然不存在于C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\bin及其子文件夹中。vcvarsall.bat运行vcvars64批处理文件,因此如果没有它,python包仍然无法安装(我忘记了此时显示的错误)。

然后我在这里找到了一些说明:http://www.cryptohaze.com/wiki/index.php/Windows_7_Build_Setup#Download_VS_2010_and_Windows_SDK_7.1按照说明,我已经安装了Express和7.1 SDK,因此安装了SDK 7.1 SP1,并修复了缺失的头文件。然后,我手动创建了vcvars64.bat,内容为CALL setenv/x64。我会把所有的说明贴在这里,这样他们就不会迷路了。

步骤1是下载Visual Studio Express 2010。http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express是一个很好的开始。下载安装程序并运行它(vc_web.exe)。您不需要SQL 2008附加下载。您还需要64位的Windows SDK(当前为7.1)编译器-除非您想进行32位编译,否则完全支持。。。http://www.microsoft.com/en-us/download/details.aspx?id=8279很好下载此文件的起点-您需要运行winsdk_web.exe下载时!这里的默认安装刚刚好。最后,下载并安装Windows SDK 7.1 SP1更新:http://www.microsoft.com/en-us/download/details.aspx?id=4422为了修复丢失的头文件,VS2010 SP1。http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=75568aa6-8107-475d-948a-ef22627e57a5该死的,修复VS2010 Express丢失的批处理文件。这越来越荒谬了。在C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\bin\amd64中,使用以下命令创建“vcvars64.bat”(您需要运行作为管理员):CALL setenv/x64

我的python包仍然没有安装(无法回忆错误)。然后我找到了一些使用特殊SDK 7.1命令提示符的说明(复制如下),请参阅:https://mail.python.org/pipermail/distutils-sig/2012-February/018300.html

别管这个问题。这里有人注意到菜单上的此项:开始->所有程序->Microsoft Windows SDK v7.1->Windows SDK 7.1命令提示符这将运行一个批处理作业,该作业似乎为编译器设置了一个工作环境。在该提示符下,您可以键入“setup.py build”或“setup.py install”。

我按照指示打开了Windows SDK 7.1命令提示符,并使用它在python包上运行easy_install。最后,成功了!


太长,读不下去了

安装Visual Studio Express 2010(最好没有更新的可再发行版或SQL server)。安装Windows 7.1 SDKInstal SDK 7.1 SP1更新和VS2010 SP1头文件修复(可能不需要此步骤)。使用内容CALL setenv/x64手动创建C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vcvars64.bat开始->所有程序->Microsoft Windows SDK v7.1->Windows SDK 7.1命令提示符以打开特殊的x64命令提示符,然后可以与python/easy_install/pip/etc(包括virtual_envs中的命令提示符)一起使用。

调用importsetuptools将对补丁distutils进行模仿,以强制与Visual Studio兼容。手动调用vcvars32.bat将设置虚拟环境并防止编译器抛出其他常见错误。对于VS 2017,文件位于

“C:\Program Files(x86)\Microsoft VisualStudio\2017\社区\VC\Auxiliary\Build\vcvars32.bat“

以下是我用来将.pyx文件快速编译为.pyd的安装脚本:(注意:它使用第三方模块发送2个

# 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()

看起来它正在寻找VC编译器,所以您可以尝试使用-c mingw32提及编译器类型,因为您有msys

python setup.py install -c mingw32

发生什么事?Python模块可以部分用C或C++编写(通常是为了速度)。如果您尝试用Pip(或setup.py)安装这样的包,它必须从源代码编译C/C++。开箱即用,Pip会厚颜无耻地假设您安装了Microsoft Visual C++编译器。如果您没有它,您将看到这条神秘的错误消息“错误:无法找到vcvarsall.bat”。

规定的解决方案是安装C/C++编译器,或者Microsoft Visual C++,或者MinGW(一个开源项目)。然而,安装和配置两者都非常困难。(编辑2014:微软发布了一个专门针对Python 2.7的C++编译器)

最简单的解决方案是为流行的Python包使用Christoph Gohlke的Windows安装程序(.msi)。他为Python2.x和3.x、32位和64位构建安装程序。您可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/


如果你也认为“错误:找不到vcvarsall.bat”是一条荒谬而晦涩且毫无帮助的消息,那么请在http://bugs.python.org/issue2943将其替换为更有用、更友好的信息。

相比之下,Ruby附带了一个包管理器Gem,并提供了一个准官方的C/C++编译器DevKit。如果您尝试安装不带软件包的软件包,您会看到以下有用的友好信息:

请更新PATH以包含构建工具或从下载DevKithttp://rubyinstaller.org/downloads并遵循以下说明http://github.com/oneclick/rubyinstaller/wiki/Development-Kit

您可以在https://stackoverflow.com/a/13445719/284795