import os, re, subprocess, sys
# Set path to Python directories.
programfiles = os.environ['programfiles']
if not programfiles:
exit('Failed to get programfiles')
python_dirs = [os.path.join(programfiles, 'Python35'),
os.path.join(programfiles, 'Python36'),
os.path.join(programfiles, 'Python37'),
os.path.join(programfiles, 'Python38')]
# Process each python directory.
for python_dir in python_dirs:
print('---')
# Set path to AutoItX3.dll.
autoitx_dll = os.path.join(python_dir, r'Lib\site-packages\AutoItLibrary\lib\AutoItX3.dll')
if not os.path.isfile(autoitx_dll):
print('File not found: "' + autoitx_dll + '"')
continue
# Set path to the makepy module.
makepy = os.path.join(python_dir, r'Lib\site-packages\win32com\client\makepy.py')
if not os.path.isfile(makepy):
print('File not found: "' + makepy + '"')
continue
# Generate cache using make.py.
command = [os.path.join(python_dir, 'python.exe'), makepy, autoitx_dll]
with subprocess.Popen(command, stderr=subprocess.PIPE, cwd=python_dir, universal_newlines=True) as p:
stderr = p.communicate()[1]
print(stderr.rstrip())
parameters = re.findall(r'^Generating to .+\\([A-F0-9\-]+)x(\d+)x(\d+)x(\d+)\.py$', stderr, re.M)
if len(parameters) == 1:
parameters = parameters[0]
print('Insert the next line into AutoItLibrary.__init__.py if not exist.\n'
' win32com.client.gencache.EnsureModule("{{{guid}}}", {major}, {minor}, {lcid})'
.format(guid=parameters[0],
major=parameters[1],
minor=parameters[2],
lcid=parameters[3]))
# Pause so the user can view the subprocess output.
input('Press the return key to continue...')
Сгенерированный кеш win32com\client\makepy.py
для AutoItLibrary из setup.py
сохраняется в папке %temp%\gen_py
. Это делается только при выполнении setup.py
. Если каталог %temp%
будет очищен позже, что приведет к удалению кэша, то я замечу, что ключевые слова, такие как Send
, могут не распознаваться роботизированной рамой.
По-видимому, одним из решений является восстановление кеша. Приведенный выше код сгенерирует кэш с помощью makepy.py
. Он также может распечатать сообщение о вставке win32com.client.gencache.EnsureModule(...)
в AutoItLibrary\__init__.py
для любой из Python версий по мере необходимости. Это обеспечит доступность кэша при импорте AutoItLibrary.
Изменение путей в коде в соответствии с вашей средой.
С дальнейшими исследованиями:
- AutoItLibrary в настоящее время имеет AutoItX 3.3.6.1 и последний AutoIt имеет AutoItX 3.3.14.5. Важно знать, что одна зарегистрированная версия может перезаписать регистрацию предыдущей регистрации.
- В настоящее время AutoItLibrary регистрирует AutoIt3X.dll без суффикса
_x64
в имени в системах x64. Я могу сослаться на AutoIt3_x64.dll, чтобы определить разницу между x86 и x64. - Любая версия AutoIt3X.dll и AutoIt3_x64.dll использует те же коды идентификаторов и последние зарегистрированные выигрыши (основанные на битности как при регистрации x86, так и x64. может сосуществовать).
Зарегистрированный идентификатор ключа класса TypeLib
равен {F8937E53-D444-4E71-9275-35B64210CC3B}
и где win32com
может выполнять поиск. - Если AutoIt3X.dll и AutoIt3_x64.dll зарегистрированы, отмените регистрацию любого 1 из этих 2 удалит ключ класса
AutoItX3.Control
. Без этого ключа AutoIt3X не будет работать, так как AutoItLibrary нуждается в этом ключе. Чтобы исправить это, зарегистрируйтесь, например, regsvr32.exe AutoIt3X.dll
как администратор в рабочем каталоге AutoIt3X.dll
. - Методы любой той же версии AutoItX будут совпадать, т.е.
AutoIt3X.dll
и AutoIt3X_x64.dll
только изменения в битности, но не методы.
Вставка win32com.client.gencache.EnsureModule("{F8937E53-D444-4E71-9275-35B64210CC3B}", 0, 1, 0)
в AutoItLibrary\__init__.py
должна обеспечить постоянную доступность кэша для любой версии AutoItX. Исходный код можно использовать для генерации кэша, хотя предлагаемое изменение в AutoItLibrary\__init__.py
делает его устаревшим, поскольку кэш генерируется при импорте AutoItLibrary
. Если идентификатор не был постоянным, то исходный код может информировать вас об используемом идентификаторе.
Кэш важен, поскольку он генерирует файлы .py с помощью таких методов, как, например:
def Send(self, strSendText=defaultNamedNotOptArg, nMode=0):
'method Send'
# etc...
, который, если отсутствует, делает Send
и многие другие недопустимым ключевым словом в AutoItLibrary.
Если зарегистрирован AutoItX 3.3.14.5, ведущие методы -
удаляются, а * Добавлены 1057 * ведущих методов по сравнению с AutoItX 3.3.6.1:
-BlockInput
-CDTray
-IniDelete
-IniRead
-IniWrite
-RegDeleteKey
-RegDeleteVal
-RegEnumKey
-RegEnumVal
-RegRead
-RegWrite
-RunAsSet
+RunAs
+RunAsWait
Так что, если любой из этих методов вызывает ошибку, вы можете вместо этого зарегистрировать AutoItX 3.3.6.1. В истории AutoItX версия 3.3.10.0 - это время, когда произошли эти изменения метода.