我在用pip安装包时遇到问题。我在Windows 8.164bit上运行python 3.3的Pyzo(预先打包了numpy、scipy等)。当我试图用pip安装需要编译一些c的包时,它失败了。
一开始我犯了个错误“找不到vcvarsall.bat”。我查了一下,它似乎试图找到用来构建我正在运行的python版本的编译器。
error: Unable to find vcvarsall.bat
pip install gives error: Unable to find vcvarsall.bat
Unable to find VCVarsall.bat using Python 2.7
error: Unable to find vcvarsall.bat to compile python modules with Visual Studio 2008 installed
我运行Visual Studio 2013是为了我的普通.Net工具,但显然python 3.3是用Visual Studio 2010编译的。所以,我安装了Visual C++ 2010 Express,但它仍然给出了相同的错误。
我设法找到了用于查找vcvarsall(Lib/distutils中的msvc9compiler.py)的源代码。所以我开始在源代码中搜索,发现它所寻找的版本是9.0(即Visual 2008)。所以我下载了2008 C++Express,然后再试一次。这次它找到了vcvarsall.bat,但是我得到了一个不同的错误“ValueError:['path']”
引发错误的方法如下。(打印由我添加以进行调试)

def query_vcvarsall(version, arch="x86"):
"""Launch vcvarsall.bat and read the settings from its environment
"""
vcvarsall = find_vcvarsall(version)
print(version)
print(arch)
print(vcvarsall)
interesting = set(("include", "lib", "libpath", "path"))
result = {}

if vcvarsall is None:
    raise DistutilsPlatformError("Unable to find vcvarsall.bat")
log.debug("Calling 'vcvarsall.bat %s' (version=%s)", arch, version)
popen = subprocess.Popen('"%s" %s & set' % (vcvarsall, arch),
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)
try:
    stdout, stderr = popen.communicate()
    if popen.wait() != 0:
        raise DistutilsPlatformError(stderr.decode("mbcs"))

    stdout = stdout.decode("mbcs")
    for line in stdout.split("\n"):
        print(line)
        line = Reg.convert_mbcs(line)
        if '=' not in line:
            continue
        line = line.strip()
        key, value = line.split('=', 1)
        key = key.lower()
        if key in interesting:
            if value.endswith(os.pathsep):
                value = value[:-1]
            result[key] = removeDuplicates(value)

finally:
    popen.stdout.close()
    popen.stderr.close()

if len(result) != len(interesting):
    print(str(result)+"::: "+str(interesting))
    raise ValueError(str(list(result.keys())))

return result

所以基本上,发生的是它检查我的环境变量并查找有趣的条目(“include”、“lib”、“lib path”、“path”)
现在,我唯一拥有的是“path”,所以最后的if语句抛出ValueError。
所以,我想知道的是其他的是什么,为什么我没有他们,为什么它在寻找他们,我如何才能解决它?
感谢所有的回答。
当做
弗雷德里克

最佳答案

问题是Visual C++ Express 2010不包括64位编译器。见How to compile a 64-bit application using Visual C++ 2010 Express

10-08 03:37