Как установить pywin32 в virtualenv с python 2.7 64 бит? - PullRequest
10 голосов
/ 10 ноября 2011

Интересно, правильный способ установки на virtualenv с 64-битным модулем python 2.7 pywin32 (операционная система Windows 7 64-битная).
Я нашел exe установщик на Sourceforge .

Когда я сначала запускаю easy_installer в командной строке, все идет хорошо, но вскоре я вижу странное поведение: при установке pywin32-216.win-amd64-py2.7 запускается pywin32-216-py2.7-win32.egg и происходит сбой с ошибкой:

No local packages or download links found for pywin32==216
Best match: None

А вот мой полный журнал:

(sandbox_virtenv) D:\test\py2exe_test>easy_install http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win-amd64-py2.7.exe
Downloading http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win-amd64-py2.7.exe
Processing pywin32-216.win-amd64-py2.7.exe
pywintypes: module references __file__
win32evtlogutil: module references __file__
win32serviceutil: module references __file__
win32timezone: module references __file__
Demos.win32rcparser_demo: module references __file__
Demos.security.sspi.validate_password: module references __file__
isapi.install: module references __file__
isapi.samples.advanced: module references __file__
isapi.samples.test: module references __file__
isapi.test.setup: module references __file__
pywin.framework.scriptutils: module references __file__
pywin.framework.startup: module references __path__
pywin.scintilla.config: module references __path__
pywin.scintilla.control: module references __file__
pywin.scintilla.IDLEenvironment: module references __file__
scripts.regsetup: module references __file__
scripts.setup_d: module references __file__
test.testall: module references __file__
test.test_clipboard: module references __file__
test.test_win32api: module references __file__
test.test_win32rcparser: module references __file__
D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\bdist_egg.py:422: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  symbols = dict.fromkeys(iter_symbols(code))
test.test_win32trace: module references __file__
win32com.__init__: module references __path__
win32com.server.register: module references __file__
win32com.server.register: module references __path__
win32com.test.GenTestScripts: module references __path__
win32com.test.pippo_server: module references __file__
win32com.test.testall: module references __file__
win32com.test.testAXScript: module references __path__
win32com.test.testDictionary: module references __file__
win32com.test.testPippo: module references __file__
win32com.test.testPyComTest: module references __file__
win32com.test.testServers: module references __file__
win32com.test.util: module references __file__
win32comext.adsi.__init__: module references __path__
win32comext.authorization.__init__: module references __path__
win32comext.axcontrol.__init__: module references __path__
win32comext.axdebug.codecontainer: module references __file__
win32comext.axdebug.debugger: module references __file__
win32comext.axdebug.__init__: module references __path__
win32comext.axscript.__init__: module references __path__
win32comext.bits.__init__: module references __path__
win32comext.directsound.__init__: module references __path__
win32comext.directsound.test.ds_test: module references __file__
win32comext.internet.__init__: module references __path__
win32comext.mapi.__init__: module references __path__
win32comext.shell.__init__: module references __path__
win32comext.shell.demos.servers.empty_volume_cache: module references __file__
win32comext.shell.demos.servers.folder_view: module references __file__
win32comext.taskscheduler.__init__: module references __path__
creating 'c:\users\antp~1.kyi\appdata\local\temp\easy_install-kclmxk\pywin32-216-py2.7-win32.egg' and adding 'c:\users\antp~1.kyi\appdata\local\temp\easy_install-kclmxk\pywin32-216-py2.7-win32.egg.tmp' to it
creating d:\test\sandbox_virtenv\lib\site-packages\pywin32-216-py2.7-win32.egg
Extracting pywin32-216-py2.7-win32.egg to d:\test\sandbox_virtenv\lib\site-packages
Adding pywin32 216 to easy-install.pth file
Installing pywin32_postinstall.py script to D:\test\sandbox_virtenv\Scripts
Installing pywin32_postinstall.pyc script to D:\test\sandbox_virtenv\Scripts
Installing pywin32_testall.py script to D:\test\sandbox_virtenv\Scripts
Installing pywin32_testall.pyc script to D:\test\sandbox_virtenv\Scripts

Installed d:\test\sandbox_virtenv\lib\site-packages\pywin32-216-py2.7-win32.egg
Processing dependencies for pywin32==216
Searching for pywin32==216
Reading http://pypi.python.org/simple/pywin32/
Reading http://sf.net/projects/pywin32
Reading https://sourceforge.net/projects/pywin32/files/pywin32/
Reading http://sourceforge.net/project/showfiles.php?group_id=78018
No local packages or download links found for pywin32==216
Best match: None
Traceback (most recent call last):
  File "D:\test\sandbox_virtenv\Scripts\easy_install-script.py", line 8, in <module>
    load_entry_point('setuptools==0.6c11', 'console_scripts', 'easy_install')()
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\easy_install.py", line 1712, in main
    with_ei_usage(lambda:
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\easy_install.py", line 1700, in with_ei_usage
    return f()
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\easy_install.py", line 1716, in <lambda>
    distclass=DistributionWithoutHelpCommands, **kw
  File "c:\Python27\Lib\distutils\core.py", line 152, in setup
    dist.run_commands()
  File "c:\Python27\Lib\distutils\dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "c:\Python27\Lib\distutils\dist.py", line 972, in run_command
    cmd_obj.run()
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\easy_install.py", line 211, in run
    self.easy_install(spec, not self.no_deps)
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\easy_install.py", line 422, in easy_install
    return self.install_item(None, download, tmpdir, deps, True)
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\easy_install.py", line 478, in install_item
    self.process_distribution(spec, dist, deps)
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\easy_install.py", line 519, in process_distribution
    [requirement], self.local_index, self.easy_install
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\pkg_resources.py", line 563, in resolve
    dist = best[req.key] = env.best_match(req, self, installer)
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\pkg_resources.py", line 799, in best_match
    return self.obtain(req, installer) # try and download/install
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\pkg_resources.py", line 811, in obtain
    return installer(requirement)
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\command\easy_install.py", line 434, in easy_install
    self.local_index
  File "D:\test\sandbox_virtenv\lib\site-packages\setuptools-0.6c11-py2.7.egg\setuptools\package_index.py", line 475, in fetch_distribution
    return dist.clone(location=self.download(dist.location, tmpdir))
AttributeError: 'NoneType' object has no attribute 'clone'

(sandbox_virtenv) D:\test\py2exe_test>

Теперь я могу импортировать из python win32api, и это довольно запутанно

(sandbox_virtenv) D:\test\py2exe_test>python
Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32api
>>>

Если вы найдете здесь что-то неясное, спросите меня. Спасибо за ваши советы.

Ответы [ 4 ]

9 голосов
/ 27 февраля 2015

Я понял это, но процесс не приятен.

Есть 3 проблемы с установщиком PyWin32:

  1. Он читает ваш установочный каталог python из реестра.
  2. Is предполагает, что ваш каталог lib является дочерним по отношению к каталогу, содержащему python.exe
  3. Сбрасывает 3 dll в% WINDIR% \ system32

Итак, если вы работаете с 64-битным Python 2.7 на 64-битных окнах или с 32 на 32, а ваша виртуальная среда находится в c: \ scratch \ env1 \, процесс выглядит следующим образом:

  1. Скопируйте python.exe и pythonw.exe из c: \ scratch \ env1 \ scripts в c: \ scratch \ env1
  2. Обновите значение «(по умолчанию)» в разделе реестра HKLM \ SOFTWARE \ Python \ PythonCore \ 2.7 \ InstallPath \ до «c: \ scratch \ env1 \» (убедитесь, что вы записали старое значение.)
  3. Из командной строки, где вы активировали виртуальную среду, установите PyWin32, запустив файл installer.exe напрямую. Не используйте easy_install.
  4. Установите для раздела реестра InstallPath исходное значение
  5. Удалите python.exe и pythonw.exe из c: \ scratch \ env1 \
  6. переместите pythoncom27.dll, pywintypes27.dll и pythoncomloader27.dll из% WINDIR% \ system32 \ в c: \ scratch \ env1 \ (не перемещайте python27.dll, иначе вы об этом пожалеете)

Это работает достаточно хорошо для запуска django-mssql в виртуальной среде без установки pywin32 вне виртуальной среды.

4 голосов
/ 03 апреля 2012

В последней версии virtualenv-1.7.1.2 попробуйте создать virtualenv с флагом --distribute.Мне удалось решить ту же самую проблему, с которой вы столкнулись, добавив флаг.

В связанной заметке на другом компьютере (та же ОС, Windows Server 2008 R2) мне пришлось создать virtualenv без флаг --distribute, в противном случае всякий раз, когда я запускаю easy_install, открывается новая командная строка.

Virtualenv в Windows похожа на мрачное искусство.

2 голосов
/ 10 марта 2015

Это старый вопрос, но недавно столкнулся с этой проблемой, и я хочу поделиться тем, что я сделал, чтобы сделать эту работу. Я искал реализацию Python Kerberos в Windows, и я нашел kerbeors_sspi, который использует Pywin32. все это устанавливается с помощью pip, но pywin32 не может быть установлен с помощью pip внутри virtualenv.

Итак, я исправил библиотеку kerberos_sspi, чтобы использовать pypiwin32, колесо, упакованное Glyph и el (BTW, создатель скрученного кода). И теперь все это прекрасно работает, но если вы хотите получить доступ к COM-компонентам, вам нужно вручную установить pywin32, потому что он должен быть зарегистрирован в системе.

Вот ссылка на индекс pypiwin32

Приветствия

2 голосов
/ 10 ноября 2011

К сожалению, поддержка 64-битного Python в Windows относительно слабая, чем 32-битная версия. Это не вина сообщества Python, а относительная сложность получения бесплатных компиляторов для 64-битной Windows.

Если вы установили 64-битную версию Python, вам также необходимо использовать пакеты, созданные для 64-битной версии. Некоторые простые пакеты Python (написанные на чистом Python и не требующие внешних библиотек / C) будут устанавливаться как обычно, используя setuptools / easy_install / virtualenv. Однако многие 64-битные пакеты могут сломаться при установке в virtualenv, и для них потребуется установщик.

К счастью, вы можете найти 64-битные скомпилированные установщики для популярных пакетов здесь . Попробуйте сначала пакет там. Программа установки нацелена на глобальную / основную установку Python и, таким образом, не изолируется посредством virtualenv. Тем не менее, обратите внимание, что это неофициальные сборки: предоставляются бесплатно для вашего удобства, поэтому, пожалуйста, не предъявляйте иск поставщику, если что-то не получится (или ожидайте помощи).

...