Compare commits
14 Commits
cc59e8b8da
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 45ce9d7186 | |||
| 78bfda1ced | |||
| 4cc6a3391f | |||
| e285191149 | |||
| cfafb9d3d4 | |||
| fbdbed37f4 | |||
| 80fdc75c26 | |||
| 2cee7731b1 | |||
| e0b36aebd3 | |||
| da7a6dd045 | |||
| 2441031bb6 | |||
| ac4d41c70b | |||
| 5c38228a1c | |||
| 9ce1dbadc1 |
BIN
__pycache__/main.cpython-312.pyc
Normal file
BIN
__pycache__/main.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
2015
build/create_a_link/Analysis-00.toc
Normal file
2015
build/create_a_link/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
293
build/create_a_link/EXE-00.toc
Normal file
293
build/create_a_link/EXE-00.toc
Normal file
@@ -0,0 +1,293 @@
|
||||
('D:\\Projects\\cjgc_upload\\dist\\create_a_link.exe',
|
||||
True,
|
||||
False,
|
||||
False,
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico',
|
||||
None,
|
||||
False,
|
||||
False,
|
||||
b'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<assembly xmlns='
|
||||
b'"urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\n <trustInfo x'
|
||||
b'mlns="urn:schemas-microsoft-com:asm.v3">\n <security>\n <requested'
|
||||
b'Privileges>\n <requestedExecutionLevel level="asInvoker" uiAccess='
|
||||
b'"false"/>\n </requestedPrivileges>\n </security>\n </trustInfo>\n '
|
||||
b'<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\n <'
|
||||
b'application>\n <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f'
|
||||
b'0}"/>\n <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\n '
|
||||
b' <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\n <s'
|
||||
b'upportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\n <supporte'
|
||||
b'dOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\n </application>\n <'
|
||||
b'/compatibility>\n <application xmlns="urn:schemas-microsoft-com:asm.v3">'
|
||||
b'\n <windowsSettings>\n <longPathAware xmlns="http://schemas.micros'
|
||||
b'oft.com/SMI/2016/WindowsSettings">true</longPathAware>\n </windowsSett'
|
||||
b'ings>\n </application>\n <dependency>\n <dependentAssembly>\n <ass'
|
||||
b'emblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version='
|
||||
b'"6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" langua'
|
||||
b'ge="*"/>\n </dependentAssembly>\n </dependency>\n</assembly>',
|
||||
True,
|
||||
False,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\create_a_link.pkg',
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\PYZ-00.pyz',
|
||||
'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\base_library.zip',
|
||||
'DATA')],
|
||||
[],
|
||||
False,
|
||||
False,
|
||||
1770274794,
|
||||
[('run.exe',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe',
|
||||
'EXECUTABLE')],
|
||||
'C:\\Program Files\\Python312\\python312.dll')
|
||||
269
build/create_a_link/PKG-00.toc
Normal file
269
build/create_a_link/PKG-00.toc
Normal file
@@ -0,0 +1,269 @@
|
||||
('D:\\Projects\\cjgc_upload\\build\\create_a_link\\create_a_link.pkg',
|
||||
{'BINARY': True,
|
||||
'DATA': True,
|
||||
'EXECUTABLE': True,
|
||||
'EXTENSION': True,
|
||||
'PYMODULE': True,
|
||||
'PYSOURCE': True,
|
||||
'PYZ': False,
|
||||
'SPLASH': True,
|
||||
'SYMLINK': False},
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\PYZ-00.pyz',
|
||||
'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\create_a_link\\base_library.zip',
|
||||
'DATA')],
|
||||
'python312.dll',
|
||||
False,
|
||||
False,
|
||||
False,
|
||||
[],
|
||||
None,
|
||||
None,
|
||||
None)
|
||||
BIN
build/create_a_link/PYZ-00.pyz
Normal file
BIN
build/create_a_link/PYZ-00.pyz
Normal file
Binary file not shown.
1765
build/create_a_link/PYZ-00.toc
Normal file
1765
build/create_a_link/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/create_a_link/base_library.zip
Normal file
BIN
build/create_a_link/base_library.zip
Normal file
Binary file not shown.
BIN
build/create_a_link/create_a_link.pkg
Normal file
BIN
build/create_a_link/create_a_link.pkg
Normal file
Binary file not shown.
BIN
build/create_a_link/localpycs/pyimod01_archive.pyc
Normal file
BIN
build/create_a_link/localpycs/pyimod01_archive.pyc
Normal file
Binary file not shown.
BIN
build/create_a_link/localpycs/pyimod02_importers.pyc
Normal file
BIN
build/create_a_link/localpycs/pyimod02_importers.pyc
Normal file
Binary file not shown.
BIN
build/create_a_link/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
build/create_a_link/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
BIN
build/create_a_link/localpycs/pyimod04_pywin32.pyc
Normal file
BIN
build/create_a_link/localpycs/pyimod04_pywin32.pyc
Normal file
Binary file not shown.
BIN
build/create_a_link/localpycs/struct.pyc
Normal file
BIN
build/create_a_link/localpycs/struct.pyc
Normal file
Binary file not shown.
64
build/create_a_link/warn-create_a_link.txt
Normal file
64
build/create_a_link/warn-create_a_link.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
This file lists modules PyInstaller was not able to find. This does not
|
||||
necessarily mean this module is required for running your program. Python and
|
||||
Python 3rd-party packages include a lot of conditional or optional modules. For
|
||||
example the module 'ntpath' only exists on Windows, whereas the module
|
||||
'posixpath' only exists on Posix systems.
|
||||
|
||||
Types if import:
|
||||
* top-level: imported at the top-level - look at these first
|
||||
* conditional: imported within an if-statement
|
||||
* delayed: imported within a function
|
||||
* optional: imported within a try-except-statement
|
||||
|
||||
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||
tracking down the missing module yourself. Thanks!
|
||||
|
||||
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||
missing module named _scproxy - imported by urllib.request (conditional)
|
||||
missing module named termios - imported by getpass (optional)
|
||||
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed)
|
||||
missing module named _sha512 - imported by random (optional)
|
||||
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
|
||||
missing module named posix - imported by os (conditional, optional), shutil (conditional), importlib._bootstrap_external (conditional), posixpath (optional)
|
||||
missing module named resource - imported by posix (top-level)
|
||||
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
|
||||
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named pyimod02_importers - imported by C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
|
||||
missing module named collections.Callable - imported by collections (optional), socks (optional)
|
||||
missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named compression - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||
missing module named annotationlib - imported by typing_extensions (conditional)
|
||||
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named h2 - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
|
||||
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
|
||||
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
|
||||
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
|
||||
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
|
||||
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named vms_lib - imported by platform (delayed, optional)
|
||||
missing module named 'java.lang' - imported by platform (delayed, optional)
|
||||
missing module named java - imported by platform (delayed)
|
||||
missing module named _winreg - imported by platform (delayed, optional), selenium.webdriver.firefox.firefox_binary (delayed, optional)
|
||||
missing module named wsaccel - imported by websocket._utils (optional)
|
||||
missing module named 'python_socks.sync' - imported by websocket._http (optional)
|
||||
missing module named 'python_socks._types' - imported by websocket._http (optional)
|
||||
missing module named python_socks - imported by websocket._http (optional)
|
||||
missing module named 'wsaccel.xormask' - imported by websocket._abnf (optional)
|
||||
missing module named win_inet_pton - imported by socks (conditional, optional)
|
||||
missing module named simplejson - imported by requests.compat (conditional, optional)
|
||||
missing module named dummy_threading - imported by requests.cookies (optional)
|
||||
missing module named fcntl - imported by subprocess (optional)
|
||||
21568
build/create_a_link/xref-create_a_link.html
Normal file
21568
build/create_a_link/xref-create_a_link.html
Normal file
File diff suppressed because it is too large
Load Diff
13638
build/scheduler_two/Analysis-00.toc
Normal file
13638
build/scheduler_two/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
6808
build/scheduler_two/EXE-00.toc
Normal file
6808
build/scheduler_two/EXE-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
6784
build/scheduler_two/PKG-00.toc
Normal file
6784
build/scheduler_two/PKG-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/scheduler_two/PYZ-00.pyz
Normal file
BIN
build/scheduler_two/PYZ-00.pyz
Normal file
Binary file not shown.
6873
build/scheduler_two/PYZ-00.toc
Normal file
6873
build/scheduler_two/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/scheduler_two/base_library.zip
Normal file
BIN
build/scheduler_two/base_library.zip
Normal file
Binary file not shown.
BIN
build/scheduler_two/localpycs/pyimod01_archive.pyc
Normal file
BIN
build/scheduler_two/localpycs/pyimod01_archive.pyc
Normal file
Binary file not shown.
BIN
build/scheduler_two/localpycs/pyimod02_importers.pyc
Normal file
BIN
build/scheduler_two/localpycs/pyimod02_importers.pyc
Normal file
Binary file not shown.
BIN
build/scheduler_two/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
build/scheduler_two/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
BIN
build/scheduler_two/localpycs/pyimod04_pywin32.pyc
Normal file
BIN
build/scheduler_two/localpycs/pyimod04_pywin32.pyc
Normal file
Binary file not shown.
BIN
build/scheduler_two/localpycs/struct.pyc
Normal file
BIN
build/scheduler_two/localpycs/struct.pyc
Normal file
Binary file not shown.
BIN
build/scheduler_two/scheduler_two.pkg
Normal file
BIN
build/scheduler_two/scheduler_two.pkg
Normal file
Binary file not shown.
347
build/scheduler_two/warn-scheduler_two.txt
Normal file
347
build/scheduler_two/warn-scheduler_two.txt
Normal file
@@ -0,0 +1,347 @@
|
||||
|
||||
This file lists modules PyInstaller was not able to find. This does not
|
||||
necessarily mean this module is required for running your program. Python and
|
||||
Python 3rd-party packages include a lot of conditional or optional modules. For
|
||||
example the module 'ntpath' only exists on Windows, whereas the module
|
||||
'posixpath' only exists on Posix systems.
|
||||
|
||||
Types if import:
|
||||
* top-level: imported at the top-level - look at these first
|
||||
* conditional: imported within an if-statement
|
||||
* delayed: imported within a function
|
||||
* optional: imported within a try-except-statement
|
||||
|
||||
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||
tracking down the missing module yourself. Thanks!
|
||||
|
||||
missing module named pwd - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), posixpath (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed), http.server (delayed, optional), psutil (optional), setuptools._distutils.util (delayed, conditional, optional), setuptools._distutils.archive_util (optional), setuptools._vendor.backports.tarfile (optional)
|
||||
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), setuptools._distutils.archive_util (optional), setuptools._vendor.backports.tarfile (optional)
|
||||
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||
missing module named fcntl - imported by subprocess (optional)
|
||||
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||
missing module named _scproxy - imported by urllib.request (conditional)
|
||||
missing module named termios - imported by getpass (optional), tty (top-level)
|
||||
missing module named _sha512 - imported by random (optional)
|
||||
missing module named urllib.urlopen - imported by urllib (delayed, optional), lxml.html (delayed, optional)
|
||||
missing module named urllib.urlencode - imported by urllib (delayed, optional), lxml.html (delayed, optional)
|
||||
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
missing module named posix - imported by shutil (conditional), importlib._bootstrap_external (conditional), os (conditional, optional), posixpath (optional)
|
||||
missing module named resource - imported by posix (top-level)
|
||||
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
|
||||
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||
missing module named annotationlib - imported by typing_extensions (conditional)
|
||||
missing module named vms_lib - imported by platform (delayed, optional)
|
||||
missing module named 'java.lang' - imported by platform (delayed, optional)
|
||||
missing module named java - imported by platform (delayed)
|
||||
missing module named _winreg - imported by platform (delayed, optional), selenium.webdriver.firefox.firefox_binary (delayed, optional)
|
||||
missing module named usercustomize - imported by site (delayed, optional)
|
||||
missing module named sitecustomize - imported by site (delayed, optional)
|
||||
missing module named readline - imported by cmd (delayed, conditional, optional), code (delayed, conditional, optional), pdb (delayed, optional), site (delayed, optional), rlcompleter (optional)
|
||||
missing module named _typeshed - imported by setuptools._distutils.dist (conditional), setuptools.glob (conditional), setuptools.compat.py311 (conditional), pkg_resources (conditional)
|
||||
missing module named '_typeshed.importlib' - imported by pkg_resources (conditional)
|
||||
missing module named jnius - imported by setuptools._vendor.platformdirs.android (delayed, conditional, optional)
|
||||
missing module named android - imported by setuptools._vendor.platformdirs.android (delayed, conditional, optional)
|
||||
missing module named importlib_resources - imported by setuptools._vendor.jaraco.text (optional)
|
||||
missing module named jaraco.text.yield_lines - imported by setuptools._vendor.jaraco.text (top-level), setuptools._entry_points (top-level), setuptools.command._requirestxt (top-level)
|
||||
missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional), setuptools._vendor.wheel.vendored.packaging._manylinux (delayed, optional)
|
||||
missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional)
|
||||
missing module named pyimod02_importers - imported by C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed), C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed)
|
||||
missing module named collections.Mapping - imported by collections (optional), pytz.lazy (optional)
|
||||
missing module named collections.Callable - imported by collections (optional), socks (optional)
|
||||
missing module named simplejson - imported by requests.compat (conditional, optional)
|
||||
missing module named dummy_threading - imported by requests.cookies (optional)
|
||||
missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named compression - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named h2 - imported by urllib3.http2.connection (top-level)
|
||||
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named win_inet_pton - imported by socks (conditional, optional)
|
||||
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
|
||||
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
|
||||
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
|
||||
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
|
||||
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
|
||||
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named six.moves.range - imported by six.moves (top-level), dateutil.rrule (top-level)
|
||||
runtime module named six.moves - imported by dateutil.tz.tz (top-level), dateutil.tz._factories (top-level), dateutil.tz.win (top-level), dateutil.rrule (top-level)
|
||||
missing module named dateutil.tz.tzfile - imported by dateutil.tz (top-level), dateutil.zoneinfo (top-level)
|
||||
missing module named StringIO - imported by six (conditional)
|
||||
missing module named numexpr - imported by pandas.core.computation.expressions (conditional), pandas.core.computation.engines (delayed)
|
||||
missing module named numba - imported by pandas.core._numba.executor (delayed, conditional), pandas.core.util.numba_ (delayed, conditional), pandas.core.window.numba_ (delayed, conditional), pandas.core.window.online (delayed, conditional), pandas.core._numba.kernels.mean_ (top-level), pandas.core._numba.kernels.shared (top-level), pandas.core._numba.kernels.sum_ (top-level), pandas.core._numba.kernels.min_max_ (top-level), pandas.core._numba.kernels.var_ (top-level), pandas.core.groupby.numba_ (delayed, conditional), pandas.core._numba.extensions (top-level)
|
||||
missing module named 'numba.extending' - imported by pandas.core._numba.kernels.sum_ (top-level)
|
||||
missing module named 'pyarrow.compute' - imported by pandas.core.arrays.arrow.accessors (conditional), pandas.core.arrays._arrow_string_mixins (conditional), pandas.core.arrays.string_arrow (conditional), pandas.core.reshape.merge (delayed, conditional), pandas.core.arrays.arrow.array (conditional)
|
||||
missing module named 'numba.typed' - imported by pandas.core._numba.extensions (delayed)
|
||||
missing module named 'numba.core' - imported by pandas.core._numba.extensions (top-level)
|
||||
missing module named pyarrow - imported by pandas.core.arrays.arrow.accessors (conditional), pandas.core.arrays.masked (delayed), pandas.core.arrays.boolean (delayed, conditional), pandas.core.arrays.string_ (delayed, conditional), pandas.core.arrays._arrow_string_mixins (conditional), pandas.core.arrays.string_arrow (conditional), pandas.core.arrays.arrow._arrow_utils (top-level), pandas.core.interchange.utils (delayed, conditional), pandas.core.strings.accessor (delayed, conditional), pandas.io.parsers.base_parser (delayed, conditional), pandas.core.arrays.interval (delayed), pandas.core.arrays.arrow.extension_types (top-level), pandas.core.arrays.period (delayed), pandas.core.methods.describe (delayed, conditional), pandas.io.sql (delayed, conditional), pandas.core.reshape.merge (delayed, conditional), pandas.core.arrays.numeric (delayed, conditional), pandas.core.interchange.buffer (conditional), pandas.io.feather_format (delayed), pandas.core.indexes.base (delayed, conditional), pandas.core.dtypes.cast (delayed, conditional), pandas.core.arrays.arrow.array (conditional), pandas.core.dtypes.dtypes (delayed, conditional), pandas.compat.pyarrow (optional), pandas.core.reshape.encoding (delayed, conditional), pandas._testing (conditional)
|
||||
missing module named _dummy_thread - imported by numpy._core.arrayprint (optional)
|
||||
missing module named numpy._core.void - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.vecmat - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ushort - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.unsignedinteger - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ulonglong - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ulong - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uintp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uintc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uint64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ubyte - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.trunc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.true_divide - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.timedelta64 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.tanh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.tan - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.subtract - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.str_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.square - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.spacing - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.sinh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.signedinteger - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.short - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.rint - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.right_shift - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.remainder - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.radians - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.rad2deg - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.power - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.positive - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.pi - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.not_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.negative - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.modf - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.mod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.minimum - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.maximum - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.matvec - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.longdouble - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.long - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_xor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_or - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_not - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_and - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logaddexp2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logaddexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log1p - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.less_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.less - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.left_shift - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ldexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.lcm - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.integer - imported by numpy._core (conditional), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.int8 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.hypot - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.heaviside - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.half - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.greater_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.greater - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.gcd - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.frompyfunc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.frexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmin - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmax - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floor_divide - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floating - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.float_power - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.float16 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fabs - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.expm1 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.exp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.euler_gamma - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.e - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.divmod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.degrees - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.deg2rad - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.datetime64 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.cosh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.cos - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.copysign - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.conjugate - imported by numpy._core (conditional), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.conj - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.complex64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.clongdouble - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.character - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ceil - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.cbrt - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bytes_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.byte - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bool_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_xor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_or - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_count - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_and - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arctanh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arctan2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arctan - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arcsinh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arcsin - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arccosh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arccos - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ones - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.hstack - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.atleast_1d - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.atleast_3d - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.vstack - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.linspace - imported by numpy._core (top-level), numpy.lib._index_tricks_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.result_type - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.number - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.max - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.array2string - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.signbit - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.isscalar - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.isnat - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.array_repr - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.arange - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.float32 - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.vecdot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.matrix_transpose - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.matmul - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.tensordot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.outer - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.cross - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.trace - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.diagonal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.reciprocal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.sort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.argsort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.sign - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.isnan - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.count_nonzero - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.divide - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.swapaxes - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.object_ - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.asanyarray - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.intp - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.atleast_2d - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.prod - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.amax - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.amin - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.moveaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.errstate - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.finfo - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.isfinite - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.sum - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.sqrt - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.multiply - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.add - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.dot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.inf - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.all - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.newaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.complexfloating - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.inexact - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.cdouble - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.csingle - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.double - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.single - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.intc - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.empty_like - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.empty - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.zeros - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.array - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.iinfo - imported by numpy._core (top-level), numpy.lib._twodim_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.transpose - imported by numpy._core (top-level), numpy.lib._function_base_impl (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.ndarray - imported by numpy._core (top-level), numpy.lib._utils_impl (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.asarray - imported by numpy._core (top-level), numpy.lib._array_utils_impl (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level), numpy.fft._helper (top-level)
|
||||
missing module named threadpoolctl - imported by numpy.lib._utils_impl (delayed, optional)
|
||||
missing module named 'scipy.stats' - imported by pandas.core.nanops (delayed, conditional), pandas.plotting._matplotlib.misc (delayed, conditional), pandas.plotting._matplotlib.hist (delayed)
|
||||
missing module named scipy - imported by pandas.core.nanops (delayed, conditional), pandas.core.missing (delayed)
|
||||
missing module named traitlets - imported by pandas.io.formats.printing (delayed, conditional)
|
||||
missing module named 'IPython.core' - imported by pandas.io.formats.printing (delayed, conditional)
|
||||
missing module named IPython - imported by pandas.io.formats.printing (delayed)
|
||||
missing module named jinja2 - imported by pyparsing.diagram (top-level), pandas.io.formats.style (top-level)
|
||||
missing module named defusedxml - imported by PIL.Image (optional), openpyxl.xml (delayed, optional)
|
||||
missing module named 'defusedxml.ElementTree' - imported by openpyxl.xml.functions (conditional)
|
||||
missing module named htmlentitydefs - imported by lxml.html.soupparser (optional)
|
||||
missing module named BeautifulSoup - imported by lxml.html.soupparser (optional)
|
||||
missing module named cchardet - imported by bs4.dammit (optional)
|
||||
missing module named 'html5lib.treebuilders' - imported by bs4.builder._html5lib (top-level), lxml.html._html5builder (top-level), lxml.html.html5parser (top-level)
|
||||
missing module named 'html5lib.constants' - imported by bs4.builder._html5lib (top-level)
|
||||
missing module named html5lib - imported by bs4.builder._html5lib (top-level), lxml.html.html5parser (top-level)
|
||||
missing module named urlparse - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
|
||||
missing module named urllib2 - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
|
||||
missing module named lxml_html_clean - imported by lxml.html.clean (optional)
|
||||
missing module named cssselect - imported by lxml.cssselect (optional)
|
||||
missing module named olefile - imported by PIL.FpxImagePlugin (top-level), PIL.MicImagePlugin (top-level)
|
||||
missing module named openpyxl.tests - imported by openpyxl.reader.excel (optional)
|
||||
missing module named 'odf.config' - imported by pandas.io.excel._odswriter (delayed)
|
||||
missing module named 'odf.style' - imported by pandas.io.excel._odswriter (delayed)
|
||||
missing module named 'odf.text' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
|
||||
missing module named 'odf.table' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
|
||||
missing module named 'odf.opendocument' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
|
||||
missing module named cStringIO - imported by xlrd.timemachine (conditional)
|
||||
missing module named pyxlsb - imported by pandas.io.excel._pyxlsb (delayed, conditional)
|
||||
missing module named 'odf.office' - imported by pandas.io.excel._odfreader (delayed)
|
||||
missing module named 'odf.element' - imported by pandas.io.excel._odfreader (delayed)
|
||||
missing module named 'odf.namespaces' - imported by pandas.io.excel._odfreader (delayed)
|
||||
missing module named odf - imported by pandas.io.excel._odfreader (conditional)
|
||||
missing module named python_calamine - imported by pandas.io.excel._calamine (delayed, conditional)
|
||||
missing module named railroad - imported by pyparsing.diagram (top-level)
|
||||
missing module named pyparsing.Word - imported by pyparsing (delayed), pyparsing.unicode (delayed)
|
||||
missing module named 'tornado.template' - imported by matplotlib.backends.backend_webagg (delayed)
|
||||
missing module named 'tornado.websocket' - imported by matplotlib.backends.backend_webagg (top-level)
|
||||
missing module named 'tornado.ioloop' - imported by matplotlib.backends.backend_webagg (top-level)
|
||||
missing module named 'tornado.web' - imported by matplotlib.backends.backend_webagg (top-level)
|
||||
missing module named tornado - imported by matplotlib.backends.backend_webagg (optional), matplotlib.backends.backend_webagg_core (delayed)
|
||||
missing module named gi - imported by matplotlib.cbook (delayed, conditional)
|
||||
missing module named numpy.VisibleDeprecationWarning - imported by numpy (optional), matplotlib.cbook (optional)
|
||||
missing module named setuptools_scm - imported by matplotlib (delayed, conditional, optional)
|
||||
missing module named markupsafe - imported by pandas.io.formats.style_render (top-level)
|
||||
missing module named botocore - imported by pandas.io.common (delayed, conditional, optional)
|
||||
missing module named sets - imported by pytz.tzinfo (optional)
|
||||
missing module named UserDict - imported by pytz.lazy (optional)
|
||||
missing module named 'scipy.sparse' - imported by pandas.core.arrays.sparse.array (conditional), pandas.core.arrays.sparse.scipy_sparse (delayed, conditional), pandas.core.arrays.sparse.accessor (delayed), pandas.core.dtypes.common (delayed, conditional, optional)
|
||||
missing module named pandas.core.internals.Block - imported by pandas.core.internals (conditional), pandas.io.pytables (conditional)
|
||||
missing module named Foundation - imported by pandas.io.clipboard (delayed, conditional, optional)
|
||||
missing module named AppKit - imported by pandas.io.clipboard (delayed, conditional, optional)
|
||||
missing module named PyQt4 - imported by pandas.io.clipboard (delayed, conditional, optional)
|
||||
missing module named qtpy - imported by pandas.io.clipboard (delayed, conditional, optional)
|
||||
missing module named pysqlcipher3 - imported by sqlalchemy.dialects.sqlite.pysqlcipher (delayed)
|
||||
missing module named sqlcipher3 - imported by sqlalchemy.dialects.sqlite.pysqlcipher (delayed, optional)
|
||||
missing module named psycopg2 - imported by sqlalchemy.dialects.postgresql.psycopg2 (delayed)
|
||||
missing module named 'psycopg.pq' - imported by sqlalchemy.dialects.postgresql.psycopg (delayed)
|
||||
missing module named 'psycopg.types' - imported by sqlalchemy.dialects.postgresql.psycopg (delayed, conditional)
|
||||
missing module named 'psycopg.adapt' - imported by sqlalchemy.dialects.postgresql.psycopg (delayed, conditional)
|
||||
missing module named psycopg - imported by sqlalchemy.dialects.postgresql.psycopg (delayed, conditional)
|
||||
missing module named asyncpg - imported by sqlalchemy.dialects.postgresql.asyncpg (delayed)
|
||||
missing module named oracledb - imported by sqlalchemy.dialects.oracle.oracledb (delayed, conditional)
|
||||
missing module named cx_Oracle - imported by sqlalchemy.dialects.oracle.cx_oracle (delayed)
|
||||
missing module named 'mysql.connector' - imported by sqlalchemy.dialects.mysql.mysqlconnector (delayed, conditional, optional)
|
||||
missing module named mysql - imported by sqlalchemy.dialects.mysql.mysqlconnector (delayed)
|
||||
missing module named asyncmy - imported by sqlalchemy.dialects.mysql.asyncmy (delayed)
|
||||
missing module named nacl - imported by pymysql._auth (delayed, optional)
|
||||
missing module named 'cryptography.hazmat' - imported by pymysql._auth (optional)
|
||||
missing module named tables - imported by pandas.io.pytables (delayed, conditional)
|
||||
missing module named 'pyarrow.fs' - imported by pandas.io.orc (conditional)
|
||||
missing module named fsspec - imported by pandas.io.orc (conditional)
|
||||
missing module named 'pyarrow.parquet' - imported by pandas.io.parquet (delayed)
|
||||
missing module named google - imported by pandas.io.gbq (conditional)
|
||||
missing module named 'numpy_distutils.cpuinfo' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named 'numpy_distutils.fcompiler' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named 'numpy_distutils.command' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named numpy_distutils - imported by numpy.f2py.diagnose (delayed, optional)
|
||||
missing module named yaml - imported by numpy.__config__ (delayed)
|
||||
missing module named numpy._distributor_init_local - imported by numpy (optional), numpy._distributor_init (optional)
|
||||
missing module named pytest - imported by pandas._testing._io (delayed), pandas._testing (delayed)
|
||||
missing module named wsaccel - imported by websocket._utils (optional)
|
||||
missing module named 'python_socks.sync' - imported by websocket._http (optional)
|
||||
missing module named 'python_socks._types' - imported by websocket._http (optional)
|
||||
missing module named python_socks - imported by websocket._http (optional)
|
||||
missing module named 'wsaccel.xormask' - imported by websocket._abnf (optional)
|
||||
76457
build/scheduler_two/xref-scheduler_two.html
Normal file
76457
build/scheduler_two/xref-scheduler_two.html
Normal file
File diff suppressed because it is too large
Load Diff
2015
build/创建无线连/Analysis-00.toc
Normal file
2015
build/创建无线连/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
291
build/创建无线连/EXE-00.toc
Normal file
291
build/创建无线连/EXE-00.toc
Normal file
@@ -0,0 +1,291 @@
|
||||
('D:\\Projects\\cjgc_upload\\dist\\创建无线连.exe',
|
||||
True,
|
||||
False,
|
||||
False,
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico',
|
||||
None,
|
||||
False,
|
||||
False,
|
||||
b'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<assembly xmlns='
|
||||
b'"urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\n <trustInfo x'
|
||||
b'mlns="urn:schemas-microsoft-com:asm.v3">\n <security>\n <requested'
|
||||
b'Privileges>\n <requestedExecutionLevel level="asInvoker" uiAccess='
|
||||
b'"false"/>\n </requestedPrivileges>\n </security>\n </trustInfo>\n '
|
||||
b'<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\n <'
|
||||
b'application>\n <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f'
|
||||
b'0}"/>\n <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\n '
|
||||
b' <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\n <s'
|
||||
b'upportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\n <supporte'
|
||||
b'dOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\n </application>\n <'
|
||||
b'/compatibility>\n <application xmlns="urn:schemas-microsoft-com:asm.v3">'
|
||||
b'\n <windowsSettings>\n <longPathAware xmlns="http://schemas.micros'
|
||||
b'oft.com/SMI/2016/WindowsSettings">true</longPathAware>\n </windowsSett'
|
||||
b'ings>\n </application>\n <dependency>\n <dependentAssembly>\n <ass'
|
||||
b'emblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version='
|
||||
b'"6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" langua'
|
||||
b'ge="*"/>\n </dependentAssembly>\n </dependency>\n</assembly>',
|
||||
True,
|
||||
False,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\创建无线连.pkg',
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz', 'D:\\Projects\\cjgc_upload\\build\\创建无线连\\PYZ-00.pyz', 'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\base_library.zip',
|
||||
'DATA')],
|
||||
[],
|
||||
False,
|
||||
False,
|
||||
1770711058,
|
||||
[('run.exe',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe',
|
||||
'EXECUTABLE')],
|
||||
'C:\\Program Files\\Python312\\python312.dll')
|
||||
267
build/创建无线连/PKG-00.toc
Normal file
267
build/创建无线连/PKG-00.toc
Normal file
@@ -0,0 +1,267 @@
|
||||
('D:\\Projects\\cjgc_upload\\build\\创建无线连\\创建无线连.pkg',
|
||||
{'BINARY': True,
|
||||
'DATA': True,
|
||||
'EXECUTABLE': True,
|
||||
'EXTENSION': True,
|
||||
'PYMODULE': True,
|
||||
'PYSOURCE': True,
|
||||
'PYZ': False,
|
||||
'SPLASH': True,
|
||||
'SYMLINK': False},
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz', 'D:\\Projects\\cjgc_upload\\build\\创建无线连\\PYZ-00.pyz', 'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\base_library.zip',
|
||||
'DATA')],
|
||||
'python312.dll',
|
||||
False,
|
||||
False,
|
||||
False,
|
||||
[],
|
||||
None,
|
||||
None,
|
||||
None)
|
||||
BIN
build/创建无线连/PYZ-00.pyz
Normal file
BIN
build/创建无线连/PYZ-00.pyz
Normal file
Binary file not shown.
1765
build/创建无线连/PYZ-00.toc
Normal file
1765
build/创建无线连/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/创建无线连/base_library.zip
Normal file
BIN
build/创建无线连/base_library.zip
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/pyimod01_archive.pyc
Normal file
BIN
build/创建无线连/localpycs/pyimod01_archive.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/pyimod02_importers.pyc
Normal file
BIN
build/创建无线连/localpycs/pyimod02_importers.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
build/创建无线连/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/pyimod04_pywin32.pyc
Normal file
BIN
build/创建无线连/localpycs/pyimod04_pywin32.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/struct.pyc
Normal file
BIN
build/创建无线连/localpycs/struct.pyc
Normal file
Binary file not shown.
64
build/创建无线连/warn-创建无线连.txt
Normal file
64
build/创建无线连/warn-创建无线连.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
This file lists modules PyInstaller was not able to find. This does not
|
||||
necessarily mean this module is required for running your program. Python and
|
||||
Python 3rd-party packages include a lot of conditional or optional modules. For
|
||||
example the module 'ntpath' only exists on Windows, whereas the module
|
||||
'posixpath' only exists on Posix systems.
|
||||
|
||||
Types if import:
|
||||
* top-level: imported at the top-level - look at these first
|
||||
* conditional: imported within an if-statement
|
||||
* delayed: imported within a function
|
||||
* optional: imported within a try-except-statement
|
||||
|
||||
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||
tracking down the missing module yourself. Thanks!
|
||||
|
||||
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||
missing module named _scproxy - imported by urllib.request (conditional)
|
||||
missing module named termios - imported by getpass (optional)
|
||||
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed)
|
||||
missing module named _sha512 - imported by random (optional)
|
||||
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
|
||||
missing module named posix - imported by os (conditional, optional), posixpath (optional), shutil (conditional), importlib._bootstrap_external (conditional)
|
||||
missing module named resource - imported by posix (top-level)
|
||||
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
|
||||
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named pyimod02_importers - imported by C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
|
||||
missing module named collections.Callable - imported by collections (optional), socks (optional)
|
||||
missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named compression - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||
missing module named annotationlib - imported by typing_extensions (conditional)
|
||||
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named h2 - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
|
||||
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
|
||||
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
|
||||
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
|
||||
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
|
||||
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named vms_lib - imported by platform (delayed, optional)
|
||||
missing module named 'java.lang' - imported by platform (delayed, optional)
|
||||
missing module named java - imported by platform (delayed)
|
||||
missing module named _winreg - imported by platform (delayed, optional), selenium.webdriver.firefox.firefox_binary (delayed, optional)
|
||||
missing module named wsaccel - imported by websocket._utils (optional)
|
||||
missing module named 'python_socks.sync' - imported by websocket._http (optional)
|
||||
missing module named 'python_socks._types' - imported by websocket._http (optional)
|
||||
missing module named python_socks - imported by websocket._http (optional)
|
||||
missing module named 'wsaccel.xormask' - imported by websocket._abnf (optional)
|
||||
missing module named win_inet_pton - imported by socks (conditional, optional)
|
||||
missing module named simplejson - imported by requests.compat (conditional, optional)
|
||||
missing module named dummy_threading - imported by requests.cookies (optional)
|
||||
missing module named fcntl - imported by subprocess (optional)
|
||||
21572
build/创建无线连/xref-创建无线连.html
Normal file
21572
build/创建无线连/xref-创建无线连.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/创建无线连/创建无线连.pkg
Normal file
BIN
build/创建无线连/创建无线连.pkg
Normal file
Binary file not shown.
2015
build/创建无线连接/Analysis-00.toc
Normal file
2015
build/创建无线连接/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
291
build/创建无线连接/EXE-00.toc
Normal file
291
build/创建无线连接/EXE-00.toc
Normal file
@@ -0,0 +1,291 @@
|
||||
('D:\\Projects\\cjgc_upload\\dist\\创建无线连接.exe',
|
||||
True,
|
||||
False,
|
||||
False,
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico',
|
||||
None,
|
||||
False,
|
||||
False,
|
||||
b'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<assembly xmlns='
|
||||
b'"urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\n <trustInfo x'
|
||||
b'mlns="urn:schemas-microsoft-com:asm.v3">\n <security>\n <requested'
|
||||
b'Privileges>\n <requestedExecutionLevel level="asInvoker" uiAccess='
|
||||
b'"false"/>\n </requestedPrivileges>\n </security>\n </trustInfo>\n '
|
||||
b'<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\n <'
|
||||
b'application>\n <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f'
|
||||
b'0}"/>\n <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\n '
|
||||
b' <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\n <s'
|
||||
b'upportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\n <supporte'
|
||||
b'dOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\n </application>\n <'
|
||||
b'/compatibility>\n <application xmlns="urn:schemas-microsoft-com:asm.v3">'
|
||||
b'\n <windowsSettings>\n <longPathAware xmlns="http://schemas.micros'
|
||||
b'oft.com/SMI/2016/WindowsSettings">true</longPathAware>\n </windowsSett'
|
||||
b'ings>\n </application>\n <dependency>\n <dependentAssembly>\n <ass'
|
||||
b'emblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version='
|
||||
b'"6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" langua'
|
||||
b'ge="*"/>\n </dependentAssembly>\n </dependency>\n</assembly>',
|
||||
True,
|
||||
False,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\创建无线连接.pkg',
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz', 'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\PYZ-00.pyz', 'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\base_library.zip',
|
||||
'DATA')],
|
||||
[],
|
||||
False,
|
||||
False,
|
||||
1773016676,
|
||||
[('run.exe',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe',
|
||||
'EXECUTABLE')],
|
||||
'C:\\Program Files\\Python312\\python312.dll')
|
||||
267
build/创建无线连接/PKG-00.toc
Normal file
267
build/创建无线连接/PKG-00.toc
Normal file
@@ -0,0 +1,267 @@
|
||||
('D:\\Projects\\cjgc_upload\\build\\创建无线连接\\创建无线连接.pkg',
|
||||
{'BINARY': True,
|
||||
'DATA': True,
|
||||
'EXECUTABLE': True,
|
||||
'EXTENSION': True,
|
||||
'PYMODULE': True,
|
||||
'PYSOURCE': True,
|
||||
'PYZ': False,
|
||||
'SPLASH': True,
|
||||
'SYMLINK': False},
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz', 'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\PYZ-00.pyz', 'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\base_library.zip',
|
||||
'DATA')],
|
||||
'python312.dll',
|
||||
False,
|
||||
False,
|
||||
False,
|
||||
[],
|
||||
None,
|
||||
None,
|
||||
None)
|
||||
BIN
build/创建无线连接/PYZ-00.pyz
Normal file
BIN
build/创建无线连接/PYZ-00.pyz
Normal file
Binary file not shown.
1765
build/创建无线连接/PYZ-00.toc
Normal file
1765
build/创建无线连接/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/创建无线连接/base_library.zip
Normal file
BIN
build/创建无线连接/base_library.zip
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/pyimod01_archive.pyc
Normal file
BIN
build/创建无线连接/localpycs/pyimod01_archive.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/pyimod02_importers.pyc
Normal file
BIN
build/创建无线连接/localpycs/pyimod02_importers.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
build/创建无线连接/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/pyimod04_pywin32.pyc
Normal file
BIN
build/创建无线连接/localpycs/pyimod04_pywin32.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/struct.pyc
Normal file
BIN
build/创建无线连接/localpycs/struct.pyc
Normal file
Binary file not shown.
64
build/创建无线连接/warn-创建无线连接.txt
Normal file
64
build/创建无线连接/warn-创建无线连接.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
This file lists modules PyInstaller was not able to find. This does not
|
||||
necessarily mean this module is required for running your program. Python and
|
||||
Python 3rd-party packages include a lot of conditional or optional modules. For
|
||||
example the module 'ntpath' only exists on Windows, whereas the module
|
||||
'posixpath' only exists on Posix systems.
|
||||
|
||||
Types if import:
|
||||
* top-level: imported at the top-level - look at these first
|
||||
* conditional: imported within an if-statement
|
||||
* delayed: imported within a function
|
||||
* optional: imported within a try-except-statement
|
||||
|
||||
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||
tracking down the missing module yourself. Thanks!
|
||||
|
||||
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||
missing module named _scproxy - imported by urllib.request (conditional)
|
||||
missing module named termios - imported by getpass (optional)
|
||||
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed)
|
||||
missing module named _sha512 - imported by random (optional)
|
||||
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
|
||||
missing module named posix - imported by os (conditional, optional), shutil (conditional), importlib._bootstrap_external (conditional), posixpath (optional)
|
||||
missing module named resource - imported by posix (top-level)
|
||||
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
|
||||
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named pyimod02_importers - imported by C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
|
||||
missing module named collections.Callable - imported by collections (optional), socks (optional)
|
||||
missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named compression - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||
missing module named annotationlib - imported by typing_extensions (conditional)
|
||||
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named h2 - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
|
||||
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
|
||||
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
|
||||
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
|
||||
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
|
||||
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named vms_lib - imported by platform (delayed, optional)
|
||||
missing module named 'java.lang' - imported by platform (delayed, optional)
|
||||
missing module named java - imported by platform (delayed)
|
||||
missing module named _winreg - imported by platform (delayed, optional), selenium.webdriver.firefox.firefox_binary (delayed, optional)
|
||||
missing module named wsaccel - imported by websocket._utils (optional)
|
||||
missing module named 'python_socks.sync' - imported by websocket._http (optional)
|
||||
missing module named 'python_socks._types' - imported by websocket._http (optional)
|
||||
missing module named python_socks - imported by websocket._http (optional)
|
||||
missing module named 'wsaccel.xormask' - imported by websocket._abnf (optional)
|
||||
missing module named win_inet_pton - imported by socks (conditional, optional)
|
||||
missing module named simplejson - imported by requests.compat (conditional, optional)
|
||||
missing module named dummy_threading - imported by requests.cookies (optional)
|
||||
missing module named fcntl - imported by subprocess (optional)
|
||||
21570
build/创建无线连接/xref-创建无线连接.html
Normal file
21570
build/创建无线连接/xref-创建无线连接.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/创建无线连接/创建无线连接.pkg
Normal file
BIN
build/创建无线连接/创建无线连接.pkg
Normal file
Binary file not shown.
13639
build/沉降观测自动上传/Analysis-00.toc
Normal file
13639
build/沉降观测自动上传/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
6808
build/沉降观测自动上传/EXE-00.toc
Normal file
6808
build/沉降观测自动上传/EXE-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
6784
build/沉降观测自动上传/PKG-00.toc
Normal file
6784
build/沉降观测自动上传/PKG-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/沉降观测自动上传/PYZ-00.pyz
Normal file
BIN
build/沉降观测自动上传/PYZ-00.pyz
Normal file
Binary file not shown.
6874
build/沉降观测自动上传/PYZ-00.toc
Normal file
6874
build/沉降观测自动上传/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/沉降观测自动上传/base_library.zip
Normal file
BIN
build/沉降观测自动上传/base_library.zip
Normal file
Binary file not shown.
BIN
build/沉降观测自动上传/localpycs/pyimod01_archive.pyc
Normal file
BIN
build/沉降观测自动上传/localpycs/pyimod01_archive.pyc
Normal file
Binary file not shown.
BIN
build/沉降观测自动上传/localpycs/pyimod02_importers.pyc
Normal file
BIN
build/沉降观测自动上传/localpycs/pyimod02_importers.pyc
Normal file
Binary file not shown.
BIN
build/沉降观测自动上传/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
build/沉降观测自动上传/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
BIN
build/沉降观测自动上传/localpycs/pyimod04_pywin32.pyc
Normal file
BIN
build/沉降观测自动上传/localpycs/pyimod04_pywin32.pyc
Normal file
Binary file not shown.
BIN
build/沉降观测自动上传/localpycs/struct.pyc
Normal file
BIN
build/沉降观测自动上传/localpycs/struct.pyc
Normal file
Binary file not shown.
347
build/沉降观测自动上传/warn-沉降观测自动上传.txt
Normal file
347
build/沉降观测自动上传/warn-沉降观测自动上传.txt
Normal file
@@ -0,0 +1,347 @@
|
||||
|
||||
This file lists modules PyInstaller was not able to find. This does not
|
||||
necessarily mean this module is required for running your program. Python and
|
||||
Python 3rd-party packages include a lot of conditional or optional modules. For
|
||||
example the module 'ntpath' only exists on Windows, whereas the module
|
||||
'posixpath' only exists on Posix systems.
|
||||
|
||||
Types if import:
|
||||
* top-level: imported at the top-level - look at these first
|
||||
* conditional: imported within an if-statement
|
||||
* delayed: imported within a function
|
||||
* optional: imported within a try-except-statement
|
||||
|
||||
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||
tracking down the missing module yourself. Thanks!
|
||||
|
||||
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed), http.server (delayed, optional), psutil (optional), setuptools._distutils.util (delayed, conditional, optional), setuptools._distutils.archive_util (optional), setuptools._vendor.backports.tarfile (optional)
|
||||
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), setuptools._distutils.archive_util (optional), setuptools._vendor.backports.tarfile (optional)
|
||||
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||
missing module named fcntl - imported by subprocess (optional)
|
||||
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||
missing module named _scproxy - imported by urllib.request (conditional)
|
||||
missing module named termios - imported by getpass (optional), tty (top-level)
|
||||
missing module named _sha512 - imported by random (optional)
|
||||
missing module named urllib.urlopen - imported by urllib (delayed, optional), lxml.html (delayed, optional)
|
||||
missing module named urllib.urlencode - imported by urllib (delayed, optional), lxml.html (delayed, optional)
|
||||
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
missing module named posix - imported by os (conditional, optional), posixpath (optional), shutil (conditional), importlib._bootstrap_external (conditional)
|
||||
missing module named resource - imported by posix (top-level)
|
||||
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
|
||||
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||
missing module named annotationlib - imported by typing_extensions (conditional)
|
||||
missing module named vms_lib - imported by platform (delayed, optional)
|
||||
missing module named 'java.lang' - imported by platform (delayed, optional)
|
||||
missing module named java - imported by platform (delayed)
|
||||
missing module named _winreg - imported by platform (delayed, optional), selenium.webdriver.firefox.firefox_binary (delayed, optional)
|
||||
missing module named usercustomize - imported by site (delayed, optional)
|
||||
missing module named sitecustomize - imported by site (delayed, optional)
|
||||
missing module named readline - imported by cmd (delayed, conditional, optional), code (delayed, conditional, optional), pdb (delayed, optional), site (delayed, optional), rlcompleter (optional)
|
||||
missing module named _typeshed - imported by setuptools._distutils.dist (conditional), setuptools.glob (conditional), setuptools.compat.py311 (conditional), pkg_resources (conditional)
|
||||
missing module named '_typeshed.importlib' - imported by pkg_resources (conditional)
|
||||
missing module named jnius - imported by setuptools._vendor.platformdirs.android (delayed, conditional, optional)
|
||||
missing module named android - imported by setuptools._vendor.platformdirs.android (delayed, conditional, optional)
|
||||
missing module named importlib_resources - imported by setuptools._vendor.jaraco.text (optional)
|
||||
missing module named jaraco.text.yield_lines - imported by setuptools._vendor.jaraco.text (top-level), setuptools._entry_points (top-level), setuptools.command._requirestxt (top-level)
|
||||
missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional), setuptools._vendor.wheel.vendored.packaging._manylinux (delayed, optional)
|
||||
missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional)
|
||||
missing module named pyimod02_importers - imported by C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed), C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed)
|
||||
missing module named collections.Mapping - imported by collections (optional), pytz.lazy (optional)
|
||||
missing module named collections.Callable - imported by collections (optional), socks (optional)
|
||||
missing module named simplejson - imported by requests.compat (conditional, optional)
|
||||
missing module named dummy_threading - imported by requests.cookies (optional)
|
||||
missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named compression - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named h2 - imported by urllib3.http2.connection (top-level)
|
||||
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named win_inet_pton - imported by socks (conditional, optional)
|
||||
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
|
||||
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
|
||||
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
|
||||
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
|
||||
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
|
||||
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named six.moves.range - imported by six.moves (top-level), dateutil.rrule (top-level)
|
||||
runtime module named six.moves - imported by dateutil.tz.tz (top-level), dateutil.tz._factories (top-level), dateutil.tz.win (top-level), dateutil.rrule (top-level)
|
||||
missing module named dateutil.tz.tzfile - imported by dateutil.tz (top-level), dateutil.zoneinfo (top-level)
|
||||
missing module named StringIO - imported by six (conditional)
|
||||
missing module named numexpr - imported by pandas.core.computation.expressions (conditional), pandas.core.computation.engines (delayed)
|
||||
missing module named numba - imported by pandas.core._numba.executor (delayed, conditional), pandas.core.util.numba_ (delayed, conditional), pandas.core.window.numba_ (delayed, conditional), pandas.core.window.online (delayed, conditional), pandas.core._numba.kernels.mean_ (top-level), pandas.core._numba.kernels.shared (top-level), pandas.core._numba.kernels.sum_ (top-level), pandas.core._numba.kernels.min_max_ (top-level), pandas.core._numba.kernels.var_ (top-level), pandas.core.groupby.numba_ (delayed, conditional), pandas.core._numba.extensions (top-level)
|
||||
missing module named 'numba.extending' - imported by pandas.core._numba.kernels.sum_ (top-level)
|
||||
missing module named 'pyarrow.compute' - imported by pandas.core.arrays.arrow.accessors (conditional), pandas.core.arrays._arrow_string_mixins (conditional), pandas.core.arrays.string_arrow (conditional), pandas.core.reshape.merge (delayed, conditional), pandas.core.arrays.arrow.array (conditional)
|
||||
missing module named 'numba.typed' - imported by pandas.core._numba.extensions (delayed)
|
||||
missing module named 'numba.core' - imported by pandas.core._numba.extensions (top-level)
|
||||
missing module named pyarrow - imported by pandas.core.arrays.arrow.accessors (conditional), pandas.core.arrays.masked (delayed), pandas.core.arrays.boolean (delayed, conditional), pandas.core.arrays.string_ (delayed, conditional), pandas.core.arrays._arrow_string_mixins (conditional), pandas.core.arrays.string_arrow (conditional), pandas.core.arrays.arrow._arrow_utils (top-level), pandas.core.interchange.utils (delayed, conditional), pandas.core.strings.accessor (delayed, conditional), pandas.io.parsers.base_parser (delayed, conditional), pandas.core.arrays.interval (delayed), pandas.core.arrays.arrow.extension_types (top-level), pandas.core.arrays.period (delayed), pandas.core.methods.describe (delayed, conditional), pandas.io.sql (delayed, conditional), pandas.core.reshape.merge (delayed, conditional), pandas.core.arrays.numeric (delayed, conditional), pandas.core.interchange.buffer (conditional), pandas.io.feather_format (delayed), pandas.core.indexes.base (delayed, conditional), pandas.core.dtypes.cast (delayed, conditional), pandas.core.arrays.arrow.array (conditional), pandas.core.dtypes.dtypes (delayed, conditional), pandas.compat.pyarrow (optional), pandas.core.reshape.encoding (delayed, conditional), pandas._testing (conditional)
|
||||
missing module named _dummy_thread - imported by numpy._core.arrayprint (optional)
|
||||
missing module named numpy._core.void - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.vecmat - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ushort - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.unsignedinteger - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ulonglong - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ulong - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uintp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uintc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uint64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ubyte - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.trunc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.true_divide - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.timedelta64 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.tanh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.tan - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.subtract - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.str_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.square - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.spacing - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.sinh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.signedinteger - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.short - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.rint - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.right_shift - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.remainder - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.radians - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.rad2deg - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.power - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.positive - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.pi - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.not_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.negative - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.modf - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.mod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.minimum - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.maximum - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.matvec - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.longdouble - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.long - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_xor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_or - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_not - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_and - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logaddexp2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logaddexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log1p - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.less_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.less - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.left_shift - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ldexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.lcm - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.integer - imported by numpy._core (conditional), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.int8 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.hypot - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.heaviside - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.half - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.greater_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.greater - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.gcd - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.frompyfunc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.frexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmin - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmax - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floor_divide - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floating - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.float_power - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.float16 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fabs - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.expm1 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.exp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.euler_gamma - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.e - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.divmod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.degrees - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.deg2rad - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.datetime64 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.cosh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.cos - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.copysign - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.conjugate - imported by numpy._core (conditional), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.conj - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.complex64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.clongdouble - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.character - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ceil - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.cbrt - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bytes_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.byte - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bool_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_xor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_or - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_count - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_and - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arctanh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arctan2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arctan - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arcsinh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arcsin - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arccosh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arccos - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ones - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.hstack - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.atleast_1d - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.atleast_3d - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.vstack - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.linspace - imported by numpy._core (top-level), numpy.lib._index_tricks_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.result_type - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.number - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.max - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.array2string - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.signbit - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.isscalar - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.isnat - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.array_repr - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.arange - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.float32 - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.vecdot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.matrix_transpose - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.matmul - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.tensordot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.outer - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.cross - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.trace - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.diagonal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.reciprocal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.sort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.argsort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.sign - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.isnan - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.count_nonzero - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.divide - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.swapaxes - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.object_ - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.asanyarray - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.intp - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.atleast_2d - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.prod - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.amax - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.amin - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.moveaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.errstate - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.finfo - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.isfinite - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.sum - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.sqrt - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.multiply - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.add - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.dot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.inf - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.all - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.newaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.complexfloating - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.inexact - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.cdouble - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.csingle - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.double - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.single - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.intc - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.empty_like - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.empty - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.zeros - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.array - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.iinfo - imported by numpy._core (top-level), numpy.lib._twodim_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.transpose - imported by numpy._core (top-level), numpy.lib._function_base_impl (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.ndarray - imported by numpy._core (top-level), numpy.lib._utils_impl (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.asarray - imported by numpy._core (top-level), numpy.lib._array_utils_impl (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level), numpy.fft._helper (top-level)
|
||||
missing module named threadpoolctl - imported by numpy.lib._utils_impl (delayed, optional)
|
||||
missing module named 'scipy.stats' - imported by pandas.core.nanops (delayed, conditional), pandas.plotting._matplotlib.misc (delayed, conditional), pandas.plotting._matplotlib.hist (delayed)
|
||||
missing module named scipy - imported by pandas.core.nanops (delayed, conditional), pandas.core.missing (delayed)
|
||||
missing module named traitlets - imported by pandas.io.formats.printing (delayed, conditional)
|
||||
missing module named 'IPython.core' - imported by pandas.io.formats.printing (delayed, conditional)
|
||||
missing module named IPython - imported by pandas.io.formats.printing (delayed)
|
||||
missing module named jinja2 - imported by pyparsing.diagram (top-level), pandas.io.formats.style (top-level)
|
||||
missing module named defusedxml - imported by PIL.Image (optional), openpyxl.xml (delayed, optional)
|
||||
missing module named 'defusedxml.ElementTree' - imported by openpyxl.xml.functions (conditional)
|
||||
missing module named htmlentitydefs - imported by lxml.html.soupparser (optional)
|
||||
missing module named BeautifulSoup - imported by lxml.html.soupparser (optional)
|
||||
missing module named cchardet - imported by bs4.dammit (optional)
|
||||
missing module named 'html5lib.treebuilders' - imported by bs4.builder._html5lib (top-level), lxml.html._html5builder (top-level), lxml.html.html5parser (top-level)
|
||||
missing module named 'html5lib.constants' - imported by bs4.builder._html5lib (top-level)
|
||||
missing module named html5lib - imported by bs4.builder._html5lib (top-level), lxml.html.html5parser (top-level)
|
||||
missing module named urlparse - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
|
||||
missing module named urllib2 - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
|
||||
missing module named lxml_html_clean - imported by lxml.html.clean (optional)
|
||||
missing module named cssselect - imported by lxml.cssselect (optional)
|
||||
missing module named olefile - imported by PIL.FpxImagePlugin (top-level), PIL.MicImagePlugin (top-level)
|
||||
missing module named openpyxl.tests - imported by openpyxl.reader.excel (optional)
|
||||
missing module named 'odf.config' - imported by pandas.io.excel._odswriter (delayed)
|
||||
missing module named 'odf.style' - imported by pandas.io.excel._odswriter (delayed)
|
||||
missing module named 'odf.text' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
|
||||
missing module named 'odf.table' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
|
||||
missing module named 'odf.opendocument' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
|
||||
missing module named cStringIO - imported by xlrd.timemachine (conditional)
|
||||
missing module named pyxlsb - imported by pandas.io.excel._pyxlsb (delayed, conditional)
|
||||
missing module named 'odf.office' - imported by pandas.io.excel._odfreader (delayed)
|
||||
missing module named 'odf.element' - imported by pandas.io.excel._odfreader (delayed)
|
||||
missing module named 'odf.namespaces' - imported by pandas.io.excel._odfreader (delayed)
|
||||
missing module named odf - imported by pandas.io.excel._odfreader (conditional)
|
||||
missing module named python_calamine - imported by pandas.io.excel._calamine (delayed, conditional)
|
||||
missing module named railroad - imported by pyparsing.diagram (top-level)
|
||||
missing module named pyparsing.Word - imported by pyparsing (delayed), pyparsing.unicode (delayed)
|
||||
missing module named 'tornado.template' - imported by matplotlib.backends.backend_webagg (delayed)
|
||||
missing module named 'tornado.websocket' - imported by matplotlib.backends.backend_webagg (top-level)
|
||||
missing module named 'tornado.ioloop' - imported by matplotlib.backends.backend_webagg (top-level)
|
||||
missing module named 'tornado.web' - imported by matplotlib.backends.backend_webagg (top-level)
|
||||
missing module named tornado - imported by matplotlib.backends.backend_webagg (optional), matplotlib.backends.backend_webagg_core (delayed)
|
||||
missing module named gi - imported by matplotlib.cbook (delayed, conditional)
|
||||
missing module named numpy.VisibleDeprecationWarning - imported by numpy (optional), matplotlib.cbook (optional)
|
||||
missing module named setuptools_scm - imported by matplotlib (delayed, conditional, optional)
|
||||
missing module named markupsafe - imported by pandas.io.formats.style_render (top-level)
|
||||
missing module named botocore - imported by pandas.io.common (delayed, conditional, optional)
|
||||
missing module named sets - imported by pytz.tzinfo (optional)
|
||||
missing module named UserDict - imported by pytz.lazy (optional)
|
||||
missing module named 'scipy.sparse' - imported by pandas.core.arrays.sparse.array (conditional), pandas.core.arrays.sparse.scipy_sparse (delayed, conditional), pandas.core.arrays.sparse.accessor (delayed), pandas.core.dtypes.common (delayed, conditional, optional)
|
||||
missing module named pandas.core.internals.Block - imported by pandas.core.internals (conditional), pandas.io.pytables (conditional)
|
||||
missing module named Foundation - imported by pandas.io.clipboard (delayed, conditional, optional)
|
||||
missing module named AppKit - imported by pandas.io.clipboard (delayed, conditional, optional)
|
||||
missing module named PyQt4 - imported by pandas.io.clipboard (delayed, conditional, optional)
|
||||
missing module named qtpy - imported by pandas.io.clipboard (delayed, conditional, optional)
|
||||
missing module named pysqlcipher3 - imported by sqlalchemy.dialects.sqlite.pysqlcipher (delayed)
|
||||
missing module named sqlcipher3 - imported by sqlalchemy.dialects.sqlite.pysqlcipher (delayed, optional)
|
||||
missing module named psycopg2 - imported by sqlalchemy.dialects.postgresql.psycopg2 (delayed)
|
||||
missing module named 'psycopg.pq' - imported by sqlalchemy.dialects.postgresql.psycopg (delayed)
|
||||
missing module named 'psycopg.types' - imported by sqlalchemy.dialects.postgresql.psycopg (delayed, conditional)
|
||||
missing module named 'psycopg.adapt' - imported by sqlalchemy.dialects.postgresql.psycopg (delayed, conditional)
|
||||
missing module named psycopg - imported by sqlalchemy.dialects.postgresql.psycopg (delayed, conditional)
|
||||
missing module named asyncpg - imported by sqlalchemy.dialects.postgresql.asyncpg (delayed)
|
||||
missing module named oracledb - imported by sqlalchemy.dialects.oracle.oracledb (delayed, conditional)
|
||||
missing module named cx_Oracle - imported by sqlalchemy.dialects.oracle.cx_oracle (delayed)
|
||||
missing module named 'mysql.connector' - imported by sqlalchemy.dialects.mysql.mysqlconnector (delayed, conditional, optional)
|
||||
missing module named mysql - imported by sqlalchemy.dialects.mysql.mysqlconnector (delayed)
|
||||
missing module named asyncmy - imported by sqlalchemy.dialects.mysql.asyncmy (delayed)
|
||||
missing module named nacl - imported by pymysql._auth (delayed, optional)
|
||||
missing module named 'cryptography.hazmat' - imported by pymysql._auth (optional)
|
||||
missing module named tables - imported by pandas.io.pytables (delayed, conditional)
|
||||
missing module named 'pyarrow.fs' - imported by pandas.io.orc (conditional)
|
||||
missing module named fsspec - imported by pandas.io.orc (conditional)
|
||||
missing module named 'pyarrow.parquet' - imported by pandas.io.parquet (delayed)
|
||||
missing module named google - imported by pandas.io.gbq (conditional)
|
||||
missing module named 'numpy_distutils.cpuinfo' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named 'numpy_distutils.fcompiler' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named 'numpy_distutils.command' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named numpy_distutils - imported by numpy.f2py.diagnose (delayed, optional)
|
||||
missing module named yaml - imported by numpy.__config__ (delayed)
|
||||
missing module named numpy._distributor_init_local - imported by numpy (optional), numpy._distributor_init (optional)
|
||||
missing module named pytest - imported by pandas._testing._io (delayed), pandas._testing (delayed)
|
||||
missing module named wsaccel - imported by websocket._utils (optional)
|
||||
missing module named 'python_socks.sync' - imported by websocket._http (optional)
|
||||
missing module named 'python_socks._types' - imported by websocket._http (optional)
|
||||
missing module named python_socks - imported by websocket._http (optional)
|
||||
missing module named 'wsaccel.xormask' - imported by websocket._abnf (optional)
|
||||
76495
build/沉降观测自动上传/xref-沉降观测自动上传.html
Normal file
76495
build/沉降观测自动上传/xref-沉降观测自动上传.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/沉降观测自动上传/沉降观测自动上传.pkg
Normal file
BIN
build/沉降观测自动上传/沉降观测自动上传.pkg
Normal file
Binary file not shown.
366
create_a_link.py
Normal file
366
create_a_link.py
Normal file
@@ -0,0 +1,366 @@
|
||||
import subprocess
|
||||
import re
|
||||
import time
|
||||
import requests
|
||||
import json
|
||||
from appium import webdriver
|
||||
from appium.webdriver.common.appiumby import AppiumBy
|
||||
from appium.options.android import UiAutomator2Options
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from urllib3.connection import port_by_scheme
|
||||
|
||||
|
||||
# =======================
|
||||
# 基础工具函数
|
||||
# =======================
|
||||
|
||||
def run_command(command):
|
||||
"""执行系统命令并返回输出"""
|
||||
result = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||
return result.stdout.strip()
|
||||
|
||||
|
||||
# =======================
|
||||
# API请求函数
|
||||
# =======================
|
||||
|
||||
def get_new_port(yh_id):
|
||||
"""从服务器获取新的端口号"""
|
||||
url = "https://engineering.yuxindazhineng.com/index/index/get_yh_port"
|
||||
headers = {
|
||||
"Content-Type": "application/x-www-form-urlencoded"
|
||||
}
|
||||
data = {
|
||||
"yh_id": yh_id
|
||||
}
|
||||
|
||||
try:
|
||||
print(f"🔍 查询服务器新端口号,用户ID: {yh_id}")
|
||||
response = requests.post(url, headers=headers, data=data, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
if result.get("code") == 0:
|
||||
print(f"✅ 查询成功,新端口号: {result.get('data', '未知')}")
|
||||
return result.get("data", None)
|
||||
else:
|
||||
print(f"❌ 查询失败: {result.get('msg', '未知错误')}")
|
||||
return None
|
||||
else:
|
||||
print(f"❌ 服务器响应错误: {response.status_code}")
|
||||
return None
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"❌ 网络请求失败: {e}")
|
||||
return None
|
||||
|
||||
def get_accounts_from_server(yh_id):
|
||||
"""从服务器获取账户信息"""
|
||||
url = "http://www.yuxindazhineng.com:3002/api/accounts/get_uplaod_data"
|
||||
headers = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
data = {
|
||||
"yh_id": yh_id
|
||||
}
|
||||
|
||||
try:
|
||||
print(f"🔍 查询服务器账户信息,用户ID: {yh_id}")
|
||||
response = requests.post(url, headers=headers, json=data, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
if result.get("code") == 0:
|
||||
print(f"✅ 查询成功,找到 {result.get('total', 0)} 个账户")
|
||||
return result.get("data", [])
|
||||
else:
|
||||
print(f"❌ 查询失败: {result.get('message', '未知错误')}")
|
||||
return []
|
||||
else:
|
||||
print(f"❌ 服务器响应错误: {response.status_code}")
|
||||
return []
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"❌ 网络请求失败: {e}")
|
||||
return []
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"❌ JSON解析失败: {e}")
|
||||
return []
|
||||
|
||||
|
||||
def update_device_info(account_id, device_name, device_port, device_ip):
|
||||
"""更新设备信息到服务器"""
|
||||
url = "http://www.yuxindazhineng.com:3002/api/accounts/update"
|
||||
headers = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
data = {
|
||||
"account_id": str(account_id),
|
||||
"account_data": {
|
||||
"device_name": str(device_name),
|
||||
"device_port": str(device_port),
|
||||
"device_ip": str(device_ip)
|
||||
}
|
||||
}
|
||||
|
||||
try:
|
||||
print(f"🔄 更新设备信息,账户ID: {account_id}")
|
||||
print(f" 设备信息: 名称={device_name}, 端口={device_port}, IP={device_ip}")
|
||||
|
||||
response = requests.post(url, headers=headers, json=data, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
if result.get("code") == 0:
|
||||
print(f"✅ 更新成功: {result.get('message', '未知信息')}")
|
||||
return True
|
||||
else:
|
||||
print(f"❌ 更新失败: {result.get('message', '未知错误')}")
|
||||
return False
|
||||
else:
|
||||
print(f"❌ 服务器响应错误: {response.status_code}")
|
||||
return False
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"❌ 网络请求失败: {e}")
|
||||
return False
|
||||
|
||||
|
||||
# =======================
|
||||
# Appium 启动
|
||||
# =======================
|
||||
|
||||
def start_appium():
|
||||
appium_port = 4723
|
||||
print(f"🚀 启动 Appium Server(端口 {appium_port})...")
|
||||
subprocess.Popen(
|
||||
["appium.cmd", "-a", "127.0.0.1", "-p", str(appium_port)],
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL
|
||||
)
|
||||
# 检查端口是否就绪(替代固定sleep)
|
||||
max_wait = 30 # 最大等待30秒
|
||||
start_time = time.time()
|
||||
while time.time() - start_time < max_wait:
|
||||
try:
|
||||
# 尝试连接Appium端口,验证是否就绪
|
||||
import socket
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(1)
|
||||
result = sock.connect_ex(("127.0.0.1", appium_port))
|
||||
sock.close()
|
||||
if result == 0: # 端口就绪
|
||||
print(f"✅ Appium Server 启动成功(端口 {appium_port})")
|
||||
return True
|
||||
except Exception:
|
||||
pass
|
||||
time.sleep(1)
|
||||
|
||||
print(f"❌ Appium Server 启动超时({max_wait}秒)")
|
||||
return False
|
||||
|
||||
|
||||
# =======================
|
||||
# 启动沉降观测 App
|
||||
# =======================
|
||||
|
||||
def start_settlement_app(device_id, device_ip, device_port):
|
||||
print(f"📱 使用 Appium 连接设备: {device_id}")
|
||||
|
||||
options = UiAutomator2Options()
|
||||
options.platform_name = "Android"
|
||||
options.device_name = device_id
|
||||
options.udid = device_id
|
||||
|
||||
# ⚠️ TODO:替换为你的真实信息
|
||||
options.app_package = "com.bjjw.cjgc"
|
||||
options.app_activity = ".activity.LoginActivity"
|
||||
|
||||
options.automation_name = "UiAutomator2"
|
||||
options.no_reset = True
|
||||
options.auto_grant_permissions = True
|
||||
options.new_command_timeout = 28800
|
||||
|
||||
# 超时增强(无线 ADB 必须)
|
||||
options.set_capability("uiautomator2ServerLaunchTimeout", 60000)
|
||||
options.set_capability("adbExecTimeout", 120000)
|
||||
|
||||
driver = webdriver.Remote(
|
||||
"http://127.0.0.1:4723",
|
||||
options=options
|
||||
)
|
||||
|
||||
# 使用ADB命令启动Activity
|
||||
try:
|
||||
adb_command = f"adb -s {device_id} shell am start -n com.bjjw.cjgc/.activity.LoginActivity"
|
||||
result = subprocess.run(adb_command, shell=True, capture_output=True, text=True)
|
||||
if result.returncode == 0:
|
||||
time.sleep(1) # 等待Activity启动
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
print("✅ 沉降观测 App 已成功启动")
|
||||
|
||||
# =======================
|
||||
# 获取用户名文本框内容
|
||||
# =======================
|
||||
app_username = None
|
||||
try:
|
||||
print("🔍 尝试获取用户名文本框内容...")
|
||||
|
||||
# 创建显式等待对象
|
||||
wait = WebDriverWait(driver, 15) # 最多等待15秒
|
||||
|
||||
# 等待用户名文本框可点击
|
||||
username_field = wait.until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/et_user_name"))
|
||||
)
|
||||
|
||||
# 获取文本框中的文本内容
|
||||
app_username = username_field.text
|
||||
|
||||
# 如果文本框是空的,尝试使用get_attribute获取文本
|
||||
if not app_username:
|
||||
app_username = username_field.get_attribute("text")
|
||||
|
||||
# 如果还是空的,尝试获取其他属性
|
||||
if not app_username:
|
||||
app_username = username_field.get_attribute("content-desc") or username_field.get_attribute("label")
|
||||
|
||||
if app_username:
|
||||
print(f"✅ 成功获取到用户名: {app_username}")
|
||||
else:
|
||||
print("⚠️ 用户名文本框为空")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 获取用户名失败: {e}")
|
||||
|
||||
return driver, app_username
|
||||
|
||||
|
||||
# =======================
|
||||
# 无线 ADB 建链主流程
|
||||
# =======================
|
||||
|
||||
def setup_adb_wireless(yh_id="68ef0e02b0138d25e2ac9918"):
|
||||
port = get_new_port(yh_id)
|
||||
# port = 3435
|
||||
print(f"🚀 开始无线 ADB 建链(端口 {port})")
|
||||
print(f"📋 用户ID: {yh_id}")
|
||||
|
||||
# 从服务器获取账户信息
|
||||
accounts = get_accounts_from_server(yh_id)
|
||||
if not accounts:
|
||||
print("❌ 未从服务器获取到账户信息,终止流程")
|
||||
return
|
||||
|
||||
devices_output = run_command("adb devices")
|
||||
lines = devices_output.splitlines()[1:]
|
||||
|
||||
usb_devices = []
|
||||
|
||||
for line in lines:
|
||||
if not line.strip():
|
||||
continue
|
||||
|
||||
device_id = line.split()[0]
|
||||
|
||||
# 跳过已经是无线的
|
||||
if ":" in device_id:
|
||||
continue
|
||||
|
||||
usb_devices.append(device_id)
|
||||
|
||||
if not usb_devices:
|
||||
print("❌ 未检测到 USB 设备")
|
||||
return
|
||||
|
||||
for serial in usb_devices:
|
||||
print(f"\n🔎 处理设备: {serial}")
|
||||
|
||||
# 获取 WLAN IP
|
||||
ip_info = run_command(f"adb -s {serial} shell ip addr show wlan0")
|
||||
ip_match = re.search(r'inet\s+(\d+\.\d+\.\d+\.\d+)', ip_info)
|
||||
|
||||
if not ip_match:
|
||||
print("⚠️ 获取 IP 失败,请确认已连接 WiFi")
|
||||
continue
|
||||
|
||||
device_ip = ip_match.group(1)
|
||||
print(f"📍 设备 IP: {device_ip}")
|
||||
|
||||
# 切 TCP 模式
|
||||
run_command(f"adb -s {serial} tcpip {port}")
|
||||
time.sleep(2)
|
||||
|
||||
# 无线连接
|
||||
connect_result = run_command(f"adb connect {device_ip}:{port}")
|
||||
|
||||
if "connected" not in connect_result.lower():
|
||||
print(f"❌ 无线连接失败: {connect_result}")
|
||||
continue
|
||||
|
||||
wireless_id = f"{device_ip}:{port}"
|
||||
print(f"✅ 无线 ADB 成功: {wireless_id}")
|
||||
|
||||
# ===== 后续自动化 =====
|
||||
start_appium()
|
||||
driver, app_username = start_settlement_app(wireless_id, device_ip, port)
|
||||
|
||||
if not app_username:
|
||||
print("⚠️ 未获取到App中的用户名,跳过服务器更新")
|
||||
continue
|
||||
|
||||
# 在账户列表中查找匹配的用户名
|
||||
matched_account = None
|
||||
for account in accounts:
|
||||
if account.get("username") == app_username:
|
||||
matched_account = account
|
||||
break
|
||||
|
||||
if not matched_account:
|
||||
print(f"❌ 未找到与用户名 '{app_username}' 匹配的账户")
|
||||
continue
|
||||
|
||||
print(f"✅ 找到匹配账户: {matched_account.get('cl_name')} ({matched_account.get('username')})")
|
||||
print(f" account_id: {matched_account.get('account_id')}")
|
||||
|
||||
# 更新设备信息到服务器
|
||||
device_name = serial # 使用设备序列号作为设备名称
|
||||
|
||||
# 构建更新数据
|
||||
update_data = {
|
||||
"account_id": matched_account.get("account_id"),
|
||||
"device_name": device_name,
|
||||
"device_port": port,
|
||||
"device_ip": device_ip
|
||||
}
|
||||
|
||||
success = update_device_info(
|
||||
account_id=matched_account.get("account_id"),
|
||||
device_name=device_name,
|
||||
device_port=port,
|
||||
device_ip=device_ip
|
||||
)
|
||||
|
||||
if success:
|
||||
print(f"🎉 所有操作完成! 账户 {matched_account.get('username')} 的设备信息已更新")
|
||||
else:
|
||||
print(f"⚠️ 设备信息更新失败,但无线连接和App启动已完成")
|
||||
|
||||
# 关闭Appium连接
|
||||
if driver:
|
||||
print("🔄 关闭Appium连接...")
|
||||
driver.quit()
|
||||
|
||||
break # 处理完第一个设备后退出,如需处理多个设备可移除此行
|
||||
|
||||
|
||||
# =======================
|
||||
# 程序入口
|
||||
# =======================
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 配置参数
|
||||
|
||||
USER_ID = "68ef0e02b0138d25e2ac9918" # 替换为实际的用户ID
|
||||
|
||||
setup_adb_wireless(USER_ID)
|
||||
38
create_a_link.spec
Normal file
38
create_a_link.spec
Normal file
@@ -0,0 +1,38 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['create_a_link.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[],
|
||||
hiddenimports=[],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
name='create_a_link',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=True,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
)
|
||||
68
debug_page_source.xml
Normal file
68
debug_page_source.xml
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
|
||||
<hierarchy index="0" class="hierarchy" rotation="0" width="1080" height="2029">
|
||||
|
||||
<android.widget.FrameLayout index="0" package="com.bjjw.cjgc" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][1080,2118]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="0" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][1080,2118]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.FrameLayout index="0" package="com.bjjw.cjgc" class="android.widget.FrameLayout" text="" resource-id="android:id/content" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,2118]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.RelativeLayout index="0" package="com.bjjw.cjgc" class="android.widget.RelativeLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,2118]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,1980]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.support.v4.view.ViewPager index="0" package="com.bjjw.cjgc" class="android.support.v4.view.ViewPager" text="" resource-id="com.bjjw.cjgc:id/vPager" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="true" selected="false" bounds="[0,89][1080,1980]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.FrameLayout index="1" package="com.bjjw.cjgc" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,1980]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.RelativeLayout index="0" package="com.bjjw.cjgc" class="android.widget.RelativeLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,1980]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.ListView index="0" package="com.bjjw.cjgc" class="android.widget.ListView" text="" resource-id="com.bjjw.cjgc:id/upload_result_list" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="true" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[28,117][1052,683]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/itemContainer" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[28,117][1052,305]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/longclick" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[56,159][875,263]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.TextView index="0" package="com.bjjw.cjgc" class="android.widget.TextView" text="CDWZQ-2标-刚性路基156右线-462321-462390-0" resource-id="com.bjjw.cjgc:id/title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,159][875,218]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
<android.widget.TextView index="1" package="com.bjjw.cjgc" class="android.widget.TextView" text="测量时间:2026-02-02 09:59:42" resource-id="com.bjjw.cjgc:id/subtitle" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,218][590,263]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.Button index="1" package="com.bjjw.cjgc" class="android.widget.Button" text="上传" resource-id="com.bjjw.cjgc:id/upload_btn" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[875,145][1024,277]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="5" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.LinearLayout index="1" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/itemContainer" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[28,306][1052,494]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/longclick" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[56,348][875,452]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.TextView index="0" package="com.bjjw.cjgc" class="android.widget.TextView" text="CDWZQ-2标-三工区-任家湾特大桥-53#-56#" resource-id="com.bjjw.cjgc:id/title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,348][875,407]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
<android.widget.TextView index="1" package="com.bjjw.cjgc" class="android.widget.TextView" text="测量时间:2026-02-28 13:34:06" resource-id="com.bjjw.cjgc:id/subtitle" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,407][585,452]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.Button index="1" package="com.bjjw.cjgc" class="android.widget.Button" text="上传" resource-id="com.bjjw.cjgc:id/upload_btn" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[875,334][1024,466]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="5" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.LinearLayout index="2" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/itemContainer" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[28,495][1052,683]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/longclick" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[56,537][875,641]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.TextView index="0" package="com.bjjw.cjgc" class="android.widget.TextView" text="CDWZQ-2标-区间路基136号-447970-448036-136" resource-id="com.bjjw.cjgc:id/title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,537][875,596]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
<android.widget.TextView index="1" package="com.bjjw.cjgc" class="android.widget.TextView" text="测量时间:2026-02-28 11:44:46" resource-id="com.bjjw.cjgc:id/subtitle" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,596][583,641]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.Button index="1" package="com.bjjw.cjgc" class="android.widget.Button" text="上传" resource-id="com.bjjw.cjgc:id/upload_btn" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[875,523][1024,655]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="5" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
</android.widget.ListView>
|
||||
|
||||
</android.widget.RelativeLayout>
|
||||
|
||||
0
dist/appium_automation.log
vendored
Normal file
0
dist/appium_automation.log
vendored
Normal file
BIN
dist/create_a_link.exe
vendored
Normal file
BIN
dist/create_a_link.exe
vendored
Normal file
Binary file not shown.
BIN
dist/创建无线连接.exe
vendored
Normal file
BIN
dist/创建无线连接.exe
vendored
Normal file
Binary file not shown.
BIN
dist/沉降观测自动上传.exe
vendored
Normal file
BIN
dist/沉降观测自动上传.exe
vendored
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
305
globals/apis.py
305
globals/apis.py
@@ -1,6 +1,7 @@
|
||||
import requests
|
||||
import json
|
||||
import logging
|
||||
import time
|
||||
import socket
|
||||
from typing import Optional, Dict, Any
|
||||
import globals.global_variable as global_variable
|
||||
@@ -52,58 +53,6 @@ def send_tcp_command(command="StartMultiple", host="127.0.0.1", port=8888, timeo
|
||||
logging.info(f"发送命令时发生错误: {str(e)}")
|
||||
return None
|
||||
|
||||
def get_breakpoint_list():
|
||||
"""
|
||||
获取需要处理的断点列表
|
||||
"""
|
||||
# 请求参数
|
||||
params = {
|
||||
'user_name': global_variable.GLOBAL_USERNAME
|
||||
}
|
||||
|
||||
# 请求地址
|
||||
url = "https://engineering.yuxindazhineng.com/index/index/get_name_all"
|
||||
|
||||
try:
|
||||
# 发送GET请求
|
||||
response = requests.get(url, params=params, timeout=30)
|
||||
|
||||
# 检查请求是否成功
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
|
||||
# 检查接口返回状态
|
||||
if result.get('code') == 0:
|
||||
data = result.get('data', [])
|
||||
logging.info("成功获取断点列表,数据条数:", len(data))
|
||||
|
||||
# 打印断点信息
|
||||
# for item in data:
|
||||
# logging.info(f"线路编码: {item.get('line_num')}, "
|
||||
# f"线路名称: {item.get('line_name')}, "
|
||||
# f"状态: {item.get('status')}, "
|
||||
# f"用户: {item.get('name')}")
|
||||
|
||||
return data
|
||||
else:
|
||||
logging.info(f"接口返回错误: {result.get('code')}")
|
||||
return [{"id": 37,
|
||||
"user_name": "wangshun",
|
||||
"name": "wangshun",
|
||||
"line_num": "L193588",
|
||||
"line_name": "CDWZQ-2标-155号路基左线-461221-461570-155左-平原",
|
||||
"status": 3
|
||||
}]
|
||||
else:
|
||||
logging.info(f"请求失败,状态码: {response.status_code}")
|
||||
return []
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
logging.info(f"请求异常: {e}")
|
||||
return []
|
||||
except ValueError as e:
|
||||
logging.info(f"JSON解析错误: {e}")
|
||||
return []
|
||||
|
||||
def get_measurement_task():
|
||||
"""
|
||||
@@ -114,7 +63,7 @@ def get_measurement_task():
|
||||
url = "https://engineering.yuxindazhineng.com/index/index/getOne"
|
||||
|
||||
# 获取用户名
|
||||
user_name = global_variable.GLOBAL_USERNAME
|
||||
user_name = global_variable.get_username()
|
||||
if not user_name:
|
||||
logging.error("未设置用户名,无法获取测量任务")
|
||||
return None
|
||||
@@ -156,8 +105,8 @@ def get_end_with_num():
|
||||
url = "https://engineering.yuxindazhineng.com/index/index/getOne3"
|
||||
|
||||
# 获取用户名
|
||||
user_name = global_variable.GLOBAL_USERNAME
|
||||
line_num = global_variable.GLOBAL_LINE_NUM
|
||||
user_name = global_variable.get_username()
|
||||
line_num = global_variable.get_line_num()
|
||||
if not line_num:
|
||||
logging.error("未设置线路编码,无法获取测量任务")
|
||||
return None
|
||||
@@ -388,92 +337,170 @@ def get_line_info_and_save_global(user_name: str) -> bool:
|
||||
api_url = "https://engineering.yuxindazhineng.com/index/index/get_name_all"
|
||||
request_params = {"user_name": user_name} # GET请求参数
|
||||
timeout = 10 # 请求超时时间(秒),避免卡进程
|
||||
max_retries = 3 # 最大重试次数
|
||||
retry_interval = 2 # 重试间隔(秒)
|
||||
|
||||
for retry in range(max_retries):
|
||||
try:
|
||||
# 1. 发送GET请求
|
||||
response = requests.get(
|
||||
url=api_url,
|
||||
params=request_params, # GET参数用params传递,自动拼接到URL后,规范且防乱码
|
||||
timeout=timeout,
|
||||
verify=False # 禁用SSL验证,适配HTTPS接口
|
||||
)
|
||||
|
||||
# 2. 校验HTTP状态码(先确保请求本身成功)
|
||||
if response.status_code != 200:
|
||||
logging.error(f"接口请求失败,HTTP状态码异常:{response.status_code},响应内容:{response.text}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 3. 解析JSON响应(接口返回是JSON格式,需解析为字典)
|
||||
try:
|
||||
response_data = response.json()
|
||||
except Exception as e:
|
||||
logging.error(f"接口返回内容非合法JSON,无法解析:{response.text},错误:{str(e)}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 4. 校验业务状态码(接口约定:code=0成功,-1失败)
|
||||
business_code = response_data.get("code")
|
||||
if business_code == 0:
|
||||
logging.info("接口业务请求成功,开始解析数据")
|
||||
elif business_code == -1:
|
||||
logging.error(f"接口业务请求失败,业务状态码code=-1,返回数据:{response_data}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
else:
|
||||
logging.warning(f"接口返回未知业务状态码:{business_code},请确认接口文档")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 5. 提取data字段,校验数据是否存在
|
||||
api_data_list = response_data.get("data")
|
||||
if not api_data_list:
|
||||
logging.warning("接口业务成功,但data字段为空或无数据")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 6. 校验data是否为列表类型
|
||||
if not isinstance(api_data_list, list):
|
||||
logging.error(f"data字段不是列表类型,实际类型:{type(api_data_list)},内容:{api_data_list}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
found_valid_data = False
|
||||
|
||||
# 7. 遍历列表,提取所有status=3的数据
|
||||
for item in api_data_list:
|
||||
# 确保每个item是字典
|
||||
if not isinstance(item, dict):
|
||||
logging.warning(f"列表中的元素不是字典类型,跳过:{item}")
|
||||
continue
|
||||
|
||||
# 获取字段值
|
||||
data_status = item.get("status")
|
||||
line_num = item.get("line_num")
|
||||
line_name = item.get("line_name")
|
||||
|
||||
# 校验status是否为3,且目标字段非空
|
||||
if data_status == 3 and line_num and line_name:
|
||||
# # 存入全局字典:key=line_num,value=line_name
|
||||
# global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT[line_num] = line_name
|
||||
# 存入全局字典:key=line_name,value=line_num
|
||||
global_variable.get_upload_breakpoint_dict()[line_name] = line_num
|
||||
|
||||
|
||||
# 如果line_name不在列表中,则添加
|
||||
if line_name not in global_variable.get_upload_breakpoint_list():
|
||||
global_variable.get_upload_breakpoint_list().append(line_name)
|
||||
|
||||
logging.info(f"找到status=3的线路信息:line_num={line_num}, line_name={line_name}")
|
||||
found_valid_data = True
|
||||
|
||||
if found_valid_data:
|
||||
# print(f"当前全局字典数据上传线路字典数据:{global_variable.get_upload_breakpoint_dict()}")
|
||||
logging.info(f"成功提取所有status=3的线路信息,当前全局字典数据:{global_variable.get_upload_breakpoint_dict()}")
|
||||
return True
|
||||
else:
|
||||
logging.warning("data列表中未找到任何status=3且字段完整的线路信息")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 捕获所有请求相关异常(超时、连接失败、网络异常等)
|
||||
except requests.exceptions.Timeout:
|
||||
logging.error(f"调用get_name_all接口超时,超时时间:{timeout}秒,请求参数:{request_params}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
except requests.exceptions.ConnectionError:
|
||||
logging.error(f"调用get_name_all接口连接失败,检查网络或接口地址是否正确:{api_url}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
except Exception as e:
|
||||
logging.error(f"调用get_name_all接口时发生未知异常:{str(e)}", exc_info=True) # exc_info=True打印异常堆栈,方便排查
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
def get_accounts_from_server(yh_id):
|
||||
"""从服务器获取账户信息"""
|
||||
url = "http://www.yuxindazhineng.com:3002/api/accounts/get_uplaod_data"
|
||||
headers = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
data = {
|
||||
"yh_id": yh_id
|
||||
}
|
||||
|
||||
try:
|
||||
# 1. 发送GET请求
|
||||
response = requests.get(
|
||||
url=api_url,
|
||||
params=request_params, # GET参数用params传递,自动拼接到URL后,规范且防乱码
|
||||
timeout=timeout,
|
||||
verify=False # 禁用SSL验证,适配HTTPS接口
|
||||
)
|
||||
print(f"🔍 查询服务器账户信息,用户ID: {yh_id}")
|
||||
response = requests.post(url, headers=headers, json=data, timeout=10)
|
||||
|
||||
# 2. 校验HTTP状态码(先确保请求本身成功)
|
||||
if response.status_code != 200:
|
||||
logging.error(f"接口请求失败,HTTP状态码异常:{response.status_code},响应内容:{response.text}")
|
||||
return False
|
||||
|
||||
# 3. 解析JSON响应(接口返回是JSON格式,需解析为字典)
|
||||
try:
|
||||
response_data = response.json()
|
||||
except Exception as e:
|
||||
logging.error(f"接口返回内容非合法JSON,无法解析:{response.text},错误:{str(e)}")
|
||||
return False
|
||||
|
||||
# 4. 校验业务状态码(接口约定:code=0成功,-1失败)
|
||||
business_code = response_data.get("code")
|
||||
if business_code == 0:
|
||||
logging.info("接口业务请求成功,开始解析数据")
|
||||
elif business_code == -1:
|
||||
logging.error(f"接口业务请求失败,业务状态码code=-1,返回数据:{response_data}")
|
||||
return False
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
if result.get("code") == 0:
|
||||
print(f"✅ 查询成功,找到 {result.get('total', 0)} 个账户")
|
||||
return result.get("data", [])
|
||||
else:
|
||||
print(f"❌ 查询失败: {result.get('message', '未知错误')}")
|
||||
return []
|
||||
else:
|
||||
logging.warning(f"接口返回未知业务状态码:{business_code},请确认接口文档")
|
||||
return False
|
||||
print(f"❌ 服务器响应错误: {response.status_code}")
|
||||
return []
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"❌ 网络请求失败: {e}")
|
||||
return []
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"❌ JSON解析失败: {e}")
|
||||
return []
|
||||
|
||||
# 5. 提取data字段,校验数据是否存在
|
||||
api_data_list = response_data.get("data")
|
||||
if not api_data_list:
|
||||
logging.warning("接口业务成功,但data字段为空或无数据")
|
||||
return False
|
||||
|
||||
# 6. 校验data是否为列表类型
|
||||
if not isinstance(api_data_list, list):
|
||||
logging.error(f"data字段不是列表类型,实际类型:{type(api_data_list)},内容:{api_data_list}")
|
||||
return False
|
||||
|
||||
found_valid_data = False
|
||||
|
||||
# 7. 遍历列表,提取所有status=3的数据
|
||||
for item in api_data_list:
|
||||
# 确保每个item是字典
|
||||
if not isinstance(item, dict):
|
||||
logging.warning(f"列表中的元素不是字典类型,跳过:{item}")
|
||||
continue
|
||||
|
||||
# 获取字段值
|
||||
data_status = item.get("status")
|
||||
line_num = item.get("line_num")
|
||||
line_name = item.get("line_name")
|
||||
|
||||
# 校验status是否为3,且目标字段非空
|
||||
if data_status == 3 and line_num and line_name:
|
||||
# # 存入全局字典:key=line_num,value=line_name
|
||||
# global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT[line_num] = line_name
|
||||
# 存入全局字典:key=line_name,value=line_num
|
||||
global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT[line_name] = line_num
|
||||
|
||||
# 如果line_name不在列表中,则添加
|
||||
if line_name not in global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST:
|
||||
global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST.append(line_name)
|
||||
|
||||
logging.info(f"找到status=3的线路信息:line_num={line_num}, line_name={line_name}")
|
||||
found_valid_data = True
|
||||
|
||||
if found_valid_data:
|
||||
logging.info(f"成功提取所有status=3的线路信息,当前全局字典数据:{global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT}")
|
||||
return True
|
||||
else:
|
||||
logging.warning("data列表中未找到任何status=3且字段完整的线路信息")
|
||||
return False
|
||||
|
||||
# 捕获所有请求相关异常(超时、连接失败、网络异常等)
|
||||
except requests.exceptions.Timeout:
|
||||
logging.error(f"调用get_name_all接口超时,超时时间:{timeout}秒,请求参数:{request_params}")
|
||||
return False
|
||||
except requests.exceptions.ConnectionError:
|
||||
logging.error(f"调用get_name_all接口连接失败,检查网络或接口地址是否正确:{api_url}")
|
||||
return False
|
||||
except Exception as e:
|
||||
logging.error(f"调用get_name_all接口时发生未知异常:{str(e)}", exc_info=True) # exc_info=True打印异常堆栈,方便排查
|
||||
return False
|
||||
@@ -48,10 +48,37 @@ def init_appium_driver(device_id, app_package="com.bjjw.cjgc", app_activity=".ac
|
||||
|
||||
try:
|
||||
# 连接Appium服务器
|
||||
driver_url = "http://127.0.0.1:4723/wd/hub"
|
||||
logging.info(f"设备 {device_id} 正在连接Appium服务器: {driver_url}")
|
||||
driver = webdriver.Remote(driver_url, options=options)
|
||||
logging.info(f"设备 {device_id} Appium服务器连接成功")
|
||||
# driver_url = "http://127.0.0.1:4723/wd/hub"
|
||||
# logging.info(f"设备 {device_id} 正在连接Appium服务器: {driver_url}")
|
||||
# driver = webdriver.Remote(driver_url, options=options)
|
||||
# logging.info(f"设备 {device_id} Appium服务器连接成功")
|
||||
driver_urls = [
|
||||
"http://127.0.0.1:4723/wd/hub", # 标准路径
|
||||
"http://127.0.0.1:4723", # 简化路径
|
||||
"http://localhost:4723/wd/hub", # localhost
|
||||
]
|
||||
|
||||
driver = None
|
||||
last_exception = None
|
||||
|
||||
# 尝试多个URL
|
||||
for driver_url in driver_urls:
|
||||
try:
|
||||
logging.info(f"设备 {device_id} 正在连接Appium服务器: {driver_url}")
|
||||
driver = webdriver.Remote(driver_url, options=options)
|
||||
logging.info(f"设备 {device_id} Appium服务器连接成功: {driver_url}")
|
||||
break # 连接成功,跳出循环
|
||||
except Exception as e:
|
||||
last_exception = e
|
||||
logging.warning(f"设备 {device_id} 连接失败 {driver_url}: {str(e)[:100]}")
|
||||
continue
|
||||
|
||||
# 检查是否连接成功
|
||||
if not driver:
|
||||
logging.error(f"设备 {device_id} 所有Appium服务器地址尝试失败")
|
||||
logging.error(f"最后错误: {str(last_exception)}")
|
||||
raise Exception(f"设备 {device_id} 无法连接到Appium服务器: {str(last_exception)}")
|
||||
|
||||
|
||||
# 初始化等待对象
|
||||
wait = WebDriverWait(driver, 20)
|
||||
@@ -60,6 +87,21 @@ def init_appium_driver(device_id, app_package="com.bjjw.cjgc", app_activity=".ac
|
||||
# 等待应用稳定
|
||||
time.sleep(2)
|
||||
|
||||
# 设置屏幕永不休眠
|
||||
try:
|
||||
# 使用ADB命令设置屏幕永不休眠
|
||||
screen_timeout_cmd = [
|
||||
"adb", "-s", device_id,
|
||||
"shell", "settings", "put", "system", "screen_off_timeout", "86400000"
|
||||
]
|
||||
timeout_result = subprocess.run(screen_timeout_cmd, capture_output=True, text=True, timeout=15)
|
||||
if timeout_result.returncode == 0:
|
||||
logging.info(f"设备 {device_id} 已成功设置屏幕永不休眠")
|
||||
else:
|
||||
logging.warning(f"设备 {device_id} 设置屏幕永不休眠失败: {timeout_result.stderr}")
|
||||
except Exception as timeout_error:
|
||||
logging.warning(f"设备 {device_id} 设置屏幕永不休眠时出错: {str(timeout_error)}")
|
||||
|
||||
logging.info(f"设备 {device_id} Appium驱动初始化完成")
|
||||
return driver, wait
|
||||
|
||||
@@ -87,7 +129,7 @@ def check_session_valid(driver, device_id=None):
|
||||
bool: 会话有效返回True,否则返回False
|
||||
"""
|
||||
if device_id is None:
|
||||
device_id = global_variable.GLOBAL_DEVICE_ID
|
||||
device_id = global_variable.get_device_id()
|
||||
device_str = f"设备 {device_id} " if device_id else ""
|
||||
|
||||
if not driver:
|
||||
@@ -158,7 +200,7 @@ def reconnect_driver(device_id, old_driver=None, app_package="com.bjjw.cjgc", ap
|
||||
"""
|
||||
# 使用传入的device_id或从全局变量获取
|
||||
if not device_id:
|
||||
device_id = global_variable.GLOBAL_DEVICE_ID
|
||||
device_id = global_variable.get_device_id()
|
||||
|
||||
# 修复device_id参数类型问题并使用全局设备ID作为备用
|
||||
actual_device_id = device_id
|
||||
@@ -174,7 +216,7 @@ def reconnect_driver(device_id, old_driver=None, app_package="com.bjjw.cjgc", ap
|
||||
|
||||
# 如果仍然没有有效的设备ID,使用全局变量
|
||||
if not actual_device_id or (isinstance(actual_device_id, str) and ("session=" in actual_device_id or len(actual_device_id.strip()) == 0)):
|
||||
actual_device_id = global_variable.GLOBAL_DEVICE_ID
|
||||
actual_device_id = global_variable.get_device_id()
|
||||
logging.warning(f"无法获取有效设备ID,使用全局变量GLOBAL_DEVICE_ID: {actual_device_id}")
|
||||
|
||||
device_id = actual_device_id # 使用修正后的设备ID
|
||||
@@ -395,7 +437,6 @@ def ensure_appium_server_running(port=4723):
|
||||
logging.error("Appium 服务启动超时!请检查 appium 命令是否在命令行可直接运行。")
|
||||
return False
|
||||
|
||||
# ... (保留 init_appium_driver, safe_quit_driver 等其他函数) ...
|
||||
|
||||
def wait_for_appium_start(port, timeout=10):
|
||||
"""
|
||||
@@ -442,7 +483,7 @@ def safe_quit_driver(driver, device_id=None):
|
||||
device_id: 设备ID(可选)
|
||||
"""
|
||||
if device_id is None:
|
||||
device_id = global_variable.GLOBAL_DEVICE_ID
|
||||
device_id = global_variable.get_device_id()
|
||||
device_str = f"设备 {device_id} " if device_id else ""
|
||||
logging.info(f"{device_str}开始关闭驱动")
|
||||
|
||||
@@ -504,7 +545,7 @@ def launch_app_manually(driver, device_id, package_name="com.bjjw.cjgc", activit
|
||||
"""
|
||||
try:
|
||||
if not device_id:
|
||||
device_id = global_variable.GLOBAL_DEVICE_ID
|
||||
device_id = global_variable.get_device_id()
|
||||
# 尝试从driver获取设备ID
|
||||
if driver and hasattr(driver, 'capabilities'):
|
||||
device_id = driver.capabilities.get('udid')
|
||||
@@ -563,7 +604,7 @@ def launch_app_manually(driver, device_id, package_name="com.bjjw.cjgc", activit
|
||||
# 使用ADB命令设置屏幕永不休眠
|
||||
screen_timeout_cmd = [
|
||||
"adb", "-s", device_id,
|
||||
"shell", "settings", "put", "system", "screen_off_timeout", "0"
|
||||
"shell", "settings", "put", "system", "screen_off_timeout", "86400000"
|
||||
]
|
||||
timeout_result = subprocess.run(screen_timeout_cmd, capture_output=True, text=True, timeout=15)
|
||||
if timeout_result.returncode == 0:
|
||||
@@ -665,6 +706,7 @@ def go_main_click_tabber_button(driver, device_id, tabber_button_text, max_retri
|
||||
tabber_button = driver.find_element(AppiumBy.ID, tabber_button_text)
|
||||
# 点击按钮
|
||||
tabber_button.click()
|
||||
tabber_button.click()
|
||||
logging.info(f"设备 {device_id} 已成功点击导航菜单按钮: {tabber_button_text}")
|
||||
|
||||
# 等待页面加载
|
||||
|
||||
@@ -1,17 +1,148 @@
|
||||
# 全局变量
|
||||
import threading
|
||||
|
||||
# 线程本地存储,为每个线程创建独立的变量副本
|
||||
thread_local = threading.local()
|
||||
|
||||
# 共享数据的锁
|
||||
upload_breakpoint_lock = threading.RLock()
|
||||
upload_success_lock = threading.RLock()
|
||||
line_time_mapping_lock = threading.RLock()
|
||||
breakpoint_dict_lock = threading.RLock()
|
||||
name_to_id_map_lock = threading.RLock()
|
||||
|
||||
# 线程安全的全局变量访问函数
|
||||
def get_device_id():
|
||||
"""获取当前线程的设备ID"""
|
||||
if not hasattr(thread_local, 'GLOBAL_DEVICE_ID'):
|
||||
thread_local.GLOBAL_DEVICE_ID = ""
|
||||
return thread_local.GLOBAL_DEVICE_ID
|
||||
|
||||
def set_device_id(device_id):
|
||||
"""设置当前线程的设备ID"""
|
||||
thread_local.GLOBAL_DEVICE_ID = device_id
|
||||
|
||||
def get_username():
|
||||
"""获取用户名(全局共享)"""
|
||||
if not hasattr(thread_local, 'GLOBAL_USERNAME'):
|
||||
thread_local.GLOBAL_USERNAME = "czyuzongwen"
|
||||
return thread_local.GLOBAL_USERNAME
|
||||
|
||||
def set_username(username):
|
||||
"""设置用户名"""
|
||||
thread_local.GLOBAL_USERNAME = username
|
||||
|
||||
def get_current_project_name():
|
||||
"""获取当前测试项目名称"""
|
||||
if not hasattr(thread_local, 'GLOBAL_CURRENT_PROJECT_NAME'):
|
||||
thread_local.GLOBAL_CURRENT_PROJECT_NAME = ""
|
||||
return thread_local.GLOBAL_CURRENT_PROJECT_NAME
|
||||
|
||||
def set_current_project_name(project_name):
|
||||
"""设置当前测试项目名称"""
|
||||
thread_local.GLOBAL_CURRENT_PROJECT_NAME = project_name
|
||||
|
||||
def get_line_num():
|
||||
"""获取线路编码"""
|
||||
if not hasattr(thread_local, 'GLOBAL_LINE_NUM'):
|
||||
thread_local.GLOBAL_LINE_NUM = ""
|
||||
return thread_local.GLOBAL_LINE_NUM
|
||||
|
||||
def set_line_num(line_num):
|
||||
"""设置线路编码"""
|
||||
thread_local.GLOBAL_LINE_NUM = line_num
|
||||
|
||||
def get_breakpoint_status_codes():
|
||||
"""获取要获取的断点状态码列表"""
|
||||
return [0, 3] # 固定值,不需要线程本地存储
|
||||
|
||||
def get_upload_breakpoint_list():
|
||||
"""获取上传断点列表"""
|
||||
if not hasattr(thread_local, 'GLOBAL_UPLOAD_BREAKPOINT_LIST'):
|
||||
thread_local.GLOBAL_UPLOAD_BREAKPOINT_LIST = []
|
||||
return thread_local.GLOBAL_UPLOAD_BREAKPOINT_LIST
|
||||
|
||||
def set_upload_breakpoint_list(breakpoint_list):
|
||||
"""设置上传断点列表"""
|
||||
thread_local.GLOBAL_UPLOAD_BREAKPOINT_LIST = breakpoint_list
|
||||
|
||||
def get_upload_breakpoint_dict():
|
||||
"""获取上传断点字典"""
|
||||
if not hasattr(thread_local, 'GLOBAL_UPLOAD_BREAKPOINT_DICT'):
|
||||
thread_local.GLOBAL_UPLOAD_BREAKPOINT_DICT = {}
|
||||
return thread_local.GLOBAL_UPLOAD_BREAKPOINT_DICT
|
||||
|
||||
def set_upload_breakpoint_dict(breakpoint_dict):
|
||||
"""设置上传断点字典"""
|
||||
thread_local.GLOBAL_UPLOAD_BREAKPOINT_DICT = breakpoint_dict
|
||||
|
||||
def get_tested_breakpoint_list():
|
||||
"""获取测量结束的断点列表"""
|
||||
if not hasattr(thread_local, 'GLOBAL_TESTED_BREAKPOINT_LIST'):
|
||||
thread_local.GLOBAL_TESTED_BREAKPOINT_LIST = []
|
||||
return thread_local.GLOBAL_TESTED_BREAKPOINT_LIST
|
||||
|
||||
def set_tested_breakpoint_list(tested_list):
|
||||
"""设置测量结束的断点列表"""
|
||||
thread_local.GLOBAL_TESTED_BREAKPOINT_LIST = tested_list
|
||||
|
||||
def get_line_time_mapping_dict():
|
||||
"""获取线路编码和对应的时间的字典"""
|
||||
if not hasattr(thread_local, 'LINE_TIME_MAPPING_DICT'):
|
||||
thread_local.LINE_TIME_MAPPING_DICT = {}
|
||||
return thread_local.LINE_TIME_MAPPING_DICT
|
||||
|
||||
def set_line_time_mapping_dict(mapping_dict):
|
||||
"""设置线路编码和对应的时间的字典"""
|
||||
thread_local.LINE_TIME_MAPPING_DICT = mapping_dict
|
||||
|
||||
def get_breakpoint_dict():
|
||||
"""获取测量结束的断点名称和对应的线路编码的字典"""
|
||||
if not hasattr(thread_local, 'GLOBAL_BREAKPOINT_DICT'):
|
||||
thread_local.GLOBAL_BREAKPOINT_DICT = {}
|
||||
return thread_local.GLOBAL_BREAKPOINT_DICT
|
||||
|
||||
def set_breakpoint_dict(breakpoint_dict):
|
||||
"""设置测量结束的断点名称和对应的线路编码的字典"""
|
||||
thread_local.GLOBAL_BREAKPOINT_DICT = breakpoint_dict
|
||||
|
||||
def get_name_to_id_map():
|
||||
"""获取数据员姓名和对应的身份证号的字典"""
|
||||
if not hasattr(thread_local, 'GLOBAL_NAME_TO_ID_MAP'):
|
||||
thread_local.GLOBAL_NAME_TO_ID_MAP = {}
|
||||
return thread_local.GLOBAL_NAME_TO_ID_MAP
|
||||
|
||||
def set_name_to_id_map(name_id_map):
|
||||
"""设置数据员姓名和对应的身份证号的字典"""
|
||||
thread_local.GLOBAL_NAME_TO_ID_MAP = name_id_map
|
||||
|
||||
def get_upload_success_breakpoint_list():
|
||||
"""获取上传成功的断点列表"""
|
||||
if not hasattr(thread_local, 'GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST'):
|
||||
thread_local.GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST = []
|
||||
return thread_local.GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST
|
||||
|
||||
def set_upload_success_breakpoint_list(success_list):
|
||||
"""设置上传成功的断点列表"""
|
||||
thread_local.GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST = success_list
|
||||
|
||||
# 为了保持 ,保留原有的全局变量名称
|
||||
# 但这些将不再被直接使用,而是通过上面的函数访问
|
||||
GLOBAL_DEVICE_ID = "" # 设备ID
|
||||
GLOBAL_USERNAME = "czyuzongwen" # 用户名
|
||||
GLOBAL_CURRENT_PROJECT_NAME = "" # 当前测试项目名称
|
||||
GLOBAL_LINE_NUM = "" # 线路编码
|
||||
GLOBAL_BREAKPOINT_STATUS_CODES = [0,3] # 要获取的断点状态码列表
|
||||
GLOBAL_UPLOAD_BREAKPOINT_LIST = []
|
||||
GLOBAL_UPLOAD_BREAKPOINT_DICT = {}
|
||||
GLOBAL_UPLOAD_BREAKPOINT_LIST = [] #
|
||||
GLOBAL_UPLOAD_BREAKPOINT_DICT = {} #
|
||||
GLOBAL_TESTED_BREAKPOINT_LIST = [] # 测量结束的断点列表
|
||||
LINE_TIME_MAPPING_DICT = {} # 存储所有线路编码和对应的时间的全局字典
|
||||
GLOBAL_BREAKPOINT_DICT = {} # 存储测量结束的断点名称和对应的线路编码的全局字典
|
||||
GLOBAL_NAME_TO_ID_MAP = {} # 存储所有数据员姓名和对应的身份证号的全局字典
|
||||
GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST = [] # 上传成功的`断点列表
|
||||
|
||||
GLOBAL_YU_ID = "68e764f0f9548871c22f93b8" # 宇恒一号ID
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
185
invalid_scheduler.py
Normal file
185
invalid_scheduler.py
Normal file
@@ -0,0 +1,185 @@
|
||||
import requests
|
||||
import time
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
|
||||
from main import DeviceAutomation
|
||||
import globals.apis as apis
|
||||
import random
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
## --- 配置区 ---
|
||||
API_URL = "http://your-api-server.com/api/tasks" # 替换为真实的接口地址
|
||||
MAX_WORKERS = 3 # 最大并发线程数,建议根据网络带宽调整
|
||||
TIME_FILE_PATH = r"D:\time.txt" # 电脑D盘下的路径
|
||||
|
||||
def parse_time_config():
|
||||
"""
|
||||
解析 D:\time.txt 文件
|
||||
返回格式: { "用户名": "16:40:20", ... }
|
||||
"""
|
||||
time_map = {}
|
||||
if not os.path.exists(TIME_FILE_PATH):
|
||||
print(f"⚠️ 未找到配置文件: {TIME_FILE_PATH}")
|
||||
return time_map
|
||||
|
||||
try:
|
||||
with open(TIME_FILE_PATH, 'r', encoding='utf-8') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
|
||||
# 使用正则匹配用户名、时间、状态
|
||||
# 兼容 wangshun 16:40:20 true 和 cdwzq3liangchaoyong 15:06:35 true
|
||||
match = re.search(r'(\w+)\s+(\d{2}:\d{2}:\d{2})\s+ok', line)
|
||||
if match:
|
||||
username = match.group(1)
|
||||
scheduled_time = match.group(2)
|
||||
time_map[username] = scheduled_time
|
||||
except Exception as e:
|
||||
print(f"❌ 解析 time.txt 失败: {e}")
|
||||
|
||||
return time_map
|
||||
|
||||
def get_remote_tasks():
|
||||
"""
|
||||
从接口获取数据
|
||||
"""
|
||||
try:
|
||||
# 1. 先获取本地文件中的配置
|
||||
local_times = parse_time_config()
|
||||
if not local_times:
|
||||
print("❌ time.txt 中没有有效的 ok 任务或文件为空")
|
||||
return {}
|
||||
|
||||
# 2. 从服务器获取账户
|
||||
accounts = apis.get_accounts_from_server("68ef0e02b0138d25e2ac9918")
|
||||
if not accounts:
|
||||
print("❌ 未从服务器获取到账户信息,终止流程")
|
||||
return {}
|
||||
|
||||
# filtered_accounts = [account for account in accounts if account.get('is_ok') == 1]
|
||||
# # print("✅ 获取账户信息成功", filtered_accounts)
|
||||
# # current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
# # 从原始 accounts 数据中筛选有 device_ip 和 device_port 且不为 None 的账户
|
||||
# device_dict = {}
|
||||
|
||||
# for account in filtered_accounts:
|
||||
# device_ip = account.get('device_ip')
|
||||
# device_port = account.get('device_port')
|
||||
|
||||
# # 检查 device_ip 和 device_port 是否都存在且不为 None
|
||||
# if device_ip and device_port:
|
||||
# # 拼接为 ip:port 格式
|
||||
# key = f"{device_ip}:{device_port}"
|
||||
# # 添加当前时间
|
||||
# # device_dict[key] = current_time
|
||||
# # 获取当前时间的 datetime 对象
|
||||
# current_datetime = datetime.now()
|
||||
|
||||
# # 生成1-2小时的随机时间
|
||||
# random_hours = random.uniform(1, 2)
|
||||
|
||||
# # 计算未来时间(datetime 对象可以加 timedelta)
|
||||
# future_datetime = current_datetime + timedelta(hours=random_hours)
|
||||
|
||||
# # 将 datetime 对象格式化为字符串
|
||||
# time_str = future_datetime.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
# # 添加时间字符串到字典
|
||||
# device_dict[key] = time_str
|
||||
|
||||
|
||||
# # 结果
|
||||
# print(device_dict)
|
||||
# return device_dict
|
||||
device_dict = {}
|
||||
today_str = datetime.now().strftime("%Y-%m-%d")
|
||||
|
||||
for account in accounts:
|
||||
# 条件1: 接口返回 is_ok == 1
|
||||
if account.get('is_ok') != 1:
|
||||
continue
|
||||
|
||||
username = account.get('username') # 假设接口中用户名的 key 是 username
|
||||
device_ip = account.get('device_ip')
|
||||
device_port = account.get('device_port')
|
||||
|
||||
# 条件2: 用户名在 time.txt 中且状态为 true (已经在 local_times 过滤过)
|
||||
if username in local_times and device_ip and device_port:
|
||||
key = f"{device_ip}:{device_port}"
|
||||
# 拼接成完整的 YYYY-MM-DD HH:MM:SS
|
||||
full_time_str = f"{today_str} {local_times[username]}"
|
||||
device_dict[key] = full_time_str
|
||||
|
||||
print(f"✅ 匹配成功,待执行任务详情: {device_dict}")
|
||||
return device_dict
|
||||
# # 模拟数据供测试
|
||||
# return {
|
||||
# "192.168.1.45:5555": "2026-02-03 10:20:00",
|
||||
# "192.168.1.100:5556": "2026-02-03 10:20:20",
|
||||
# "192.168.31.12:5557": "2026-02-03 10:21:00"
|
||||
# }
|
||||
except Exception as e:
|
||||
print(f"❌ 获取接口任务失败: {e}")
|
||||
return {}
|
||||
|
||||
def run_task(address, target_time):
|
||||
"""
|
||||
单个线程的任务包装器
|
||||
"""
|
||||
# 格式化账号/设备名:确保带上端口号
|
||||
device_address = address
|
||||
|
||||
print(f"🕒 [等待/启动] 设备: {device_address} | 预定时间: {target_time}")
|
||||
# 解析目标时间
|
||||
target_datetime = datetime.strptime(target_time, "%Y-%m-%d %H:%M:%S")
|
||||
current_datetime = datetime.now()
|
||||
|
||||
# 计算等待时间
|
||||
wait_seconds = (target_datetime - current_datetime).total_seconds()
|
||||
|
||||
# 如果需要等待
|
||||
if wait_seconds > 0:
|
||||
print(f"⏳ [等待中] 设备: {device_address} | 等待时间: {wait_seconds:.2f}秒")
|
||||
time.sleep(wait_seconds)
|
||||
print(f"▶️ [开始执行] 设备: {device_address} | 当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
else:
|
||||
print(f"▶️ [开始执行] 设备: {device_address} | 当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
|
||||
|
||||
try:
|
||||
# 创建DeviceAutomation实例并执行上传逻辑
|
||||
automation = DeviceAutomation(device_address)
|
||||
result = automation.handle_app_state()
|
||||
return f"✅ {device_address} 完成: {result}"
|
||||
except Exception as e:
|
||||
return f"❌ {device_address} 报错: {str(e)}"
|
||||
|
||||
def monitor_center():
|
||||
"""调度中心"""
|
||||
tasks_data = get_remote_tasks()
|
||||
|
||||
if not tasks_data:
|
||||
print("📭 接口未返回任何任务,程序退出。")
|
||||
return
|
||||
|
||||
print(f"🗂️ 发现 {len(tasks_data)} 个待处理账号,开始建立线程池...")
|
||||
|
||||
# 使用线程池并发执行
|
||||
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
|
||||
# 提交所有任务
|
||||
future_to_device = {
|
||||
executor.submit(run_task, acc, t): acc
|
||||
for acc, t in tasks_data.items()
|
||||
}
|
||||
|
||||
# 实时打印完成情况
|
||||
for future in as_completed(future_to_device):
|
||||
print(future.result())
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("🚀 自动化调度程序启动...")
|
||||
monitor_center()
|
||||
print("🏁 所有并发任务处理序列结束。")
|
||||
317
main.py
317
main.py
@@ -32,156 +32,11 @@ logging.basicConfig(
|
||||
]
|
||||
)
|
||||
|
||||
class DeviceAutomation:
|
||||
@staticmethod
|
||||
def get_device_id() -> str:
|
||||
class DeviceAutomation(object):
|
||||
|
||||
# """
|
||||
# 获取设备ID,优先使用已连接设备,否则使用全局配置
|
||||
# """
|
||||
# try:
|
||||
# # 检查已连接设备
|
||||
# result = subprocess.run(
|
||||
# ["adb", "devices"],
|
||||
# capture_output=True,
|
||||
# text=True,
|
||||
# timeout=10
|
||||
# )
|
||||
|
||||
# # 解析设备列表
|
||||
# for line in result.stdout.strip().split('\n')[1:]:
|
||||
# if line.strip() and "device" in line and "offline" not in line:
|
||||
# device_id = line.split('\t')[0]
|
||||
# logging.info(f"使用已连接设备: {device_id}")
|
||||
# global_variable.GLOBAL_DEVICE_ID = device_id
|
||||
# return device_id
|
||||
|
||||
# except Exception as e:
|
||||
# logging.warning(f"设备检测失败: {e}")
|
||||
|
||||
"""
|
||||
获取设备ID,优先使用无线连接设备,否则尝试开启无线调试,最后使用全局配置
|
||||
"""
|
||||
try:
|
||||
# 检查已连接设备
|
||||
result = subprocess.run(
|
||||
["adb", "devices"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
)
|
||||
|
||||
# 解析设备列表
|
||||
wireless_device_id = None
|
||||
usb_device_id = None
|
||||
|
||||
# 先查找无线连接的设备(IP:端口格式)
|
||||
for line in result.stdout.strip().split('\n')[1:]:
|
||||
if line.strip() and "device" in line and "offline" not in line:
|
||||
current_device = line.split('\t')[0]
|
||||
# 检查是否为IP:端口格式的无线连接
|
||||
if ":" in current_device and any(char.isdigit() for char in current_device):
|
||||
wireless_device_id = current_device
|
||||
logging.info(f"使用无线连接设备: {wireless_device_id}")
|
||||
global_variable.GLOBAL_DEVICE_ID = wireless_device_id
|
||||
return wireless_device_id
|
||||
else:
|
||||
# 记录第一个USB连接的设备
|
||||
if not usb_device_id:
|
||||
usb_device_id = current_device
|
||||
|
||||
# 如果没有找到无线连接的设备,尝试使用USB设备开启无线调试
|
||||
if not wireless_device_id and usb_device_id:
|
||||
logging.info(f"未找到无线连接设备,尝试使用USB设备 {usb_device_id} 开启无线调试")
|
||||
|
||||
# 尝试获取设备IP地址
|
||||
try:
|
||||
import re
|
||||
import time
|
||||
|
||||
ip_result = subprocess.run(
|
||||
["adb", "-s", usb_device_id, "shell", "ip", "-f", "inet", "addr", "show", "wlan0"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
)
|
||||
|
||||
# 解析IP地址
|
||||
ip_output = ip_result.stdout
|
||||
if "inet " in ip_output:
|
||||
# 提取IP地址
|
||||
ip_match = re.search(r'inet\s+(\d+\.\d+\.\d+\.\d+)', ip_output)
|
||||
if ip_match:
|
||||
device_ip = ip_match.group(1)
|
||||
logging.info(f"获取到设备IP地址: {device_ip}")
|
||||
|
||||
# 开启无线调试
|
||||
tcpip_result = subprocess.run(
|
||||
["adb", "-s", usb_device_id, "tcpip", "5555"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
)
|
||||
|
||||
if "restarting in TCP mode port: 5555" in tcpip_result.stdout:
|
||||
logging.info("无线调试已开启,端口: 5555")
|
||||
|
||||
# 等待几秒钟让设备准备好
|
||||
time.sleep(3)
|
||||
|
||||
# 连接到无线设备
|
||||
connect_result = subprocess.run(
|
||||
["adb", "connect", f"{device_ip}:5555"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=10
|
||||
)
|
||||
|
||||
if "connected to" in connect_result.stdout:
|
||||
logging.info(f"成功连接到无线设备: {device_ip}:5555")
|
||||
global_variable.GLOBAL_DEVICE_ID = f"{device_ip}:5555"
|
||||
return f"{device_ip}:5555"
|
||||
else:
|
||||
logging.warning(f"连接无线设备失败: {connect_result.stderr}")
|
||||
logging.info(f"使用USB设备: {usb_device_id}")
|
||||
global_variable.GLOBAL_DEVICE_ID = usb_device_id
|
||||
return usb_device_id
|
||||
else:
|
||||
logging.warning(f"开启无线调试失败: {tcpip_result.stderr}")
|
||||
logging.info(f"使用USB设备: {usb_device_id}")
|
||||
global_variable.GLOBAL_DEVICE_ID = usb_device_id
|
||||
return usb_device_id
|
||||
else:
|
||||
logging.warning("未找到设备IP地址")
|
||||
logging.info(f"使用USB设备: {usb_device_id}")
|
||||
global_variable.GLOBAL_DEVICE_ID = usb_device_id
|
||||
return usb_device_id
|
||||
else:
|
||||
logging.warning("无法获取设备IP地址,可能设备未连接到WiFi")
|
||||
logging.info(f"使用USB设备: {usb_device_id}")
|
||||
global_variable.GLOBAL_DEVICE_ID = usb_device_id
|
||||
return usb_device_id
|
||||
except Exception as e:
|
||||
logging.warning(f"开启无线调试时出错: {str(e)}")
|
||||
logging.info(f"使用USB设备: {usb_device_id}")
|
||||
global_variable.GLOBAL_DEVICE_ID = usb_device_id
|
||||
return usb_device_id
|
||||
|
||||
except Exception as e:
|
||||
logging.warning(f"设备检测失败: {e}")
|
||||
|
||||
|
||||
# 使用全局配置
|
||||
device_id = global_variable.GLOBAL_DEVICE_ID
|
||||
logging.info(f"使用全局配置设备: {device_id}")
|
||||
return device_id
|
||||
|
||||
def __init__(self, device_id=None):
|
||||
# 如果没有提供设备ID,则自动获取
|
||||
if device_id is None:
|
||||
self.device_id = self.get_device_id()
|
||||
else:
|
||||
self.device_id = device_id
|
||||
self.device_id = device_id
|
||||
|
||||
# 初始化权限
|
||||
if permissions.grant_appium_permissions(self.device_id):
|
||||
@@ -276,13 +131,13 @@ class DeviceAutomation:
|
||||
logging.info(f"设备 {self.device_id} 登录成功,继续执行更新操作")
|
||||
time.sleep(1)
|
||||
|
||||
# 执行更新操作
|
||||
if not self.download_tabbar_page.download_tabbar_page_manager():
|
||||
logging.error(f"设备 {self.device_id} 更新操作执行失败")
|
||||
return False
|
||||
# # 执行更新操作
|
||||
# if not self.download_tabbar_page.download_tabbar_page_manager():
|
||||
# logging.error(f"设备 {self.device_id} 更新操作执行失败")
|
||||
# return False
|
||||
|
||||
# 获取状态为3的线路。
|
||||
apis.get_line_info_and_save_global(user_name=global_variable.GLOBAL_USERNAME);
|
||||
apis.get_line_info_and_save_global(user_name=global_variable.get_username());
|
||||
# # 虚拟数据替代
|
||||
# global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT = {'CDWZQ-2标-龙骨湾右线大桥-0-7号墩-平原': 'L156372', 'CDWZQ-2标-蓝家湾特大 桥-31-31-平原': 'L159206'}
|
||||
# global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST = list(global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT.keys())
|
||||
@@ -299,7 +154,7 @@ class DeviceAutomation:
|
||||
|
||||
|
||||
# 检查是否有需要上传的断点
|
||||
if not global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST:
|
||||
if not global_variable.get_upload_breakpoint_list():
|
||||
logging.info(f"设备 {self.device_id} 断点列表为空,无需执行上传操作")
|
||||
return False
|
||||
|
||||
@@ -308,52 +163,119 @@ class DeviceAutomation:
|
||||
EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/img_2_layout"))
|
||||
)
|
||||
upload_page_btn.click()
|
||||
upload_page_btn.click()
|
||||
time.sleep(0.5)
|
||||
|
||||
upload_success_count = 0 # 上传成功的断点数量
|
||||
# 实现连续获取断点列表直到两次相同
|
||||
previous_breakpoint_list = None
|
||||
current_breakpoint_list = None
|
||||
max_attempts = 5 # 最大尝试次数
|
||||
attempt_count = 0
|
||||
while attempt_count < max_attempts:
|
||||
# 获取当前页面的断点列表
|
||||
|
||||
# 遍历断点列表,逐个执行上传操作
|
||||
upload_success_count = 0
|
||||
for breakpoint_name in global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST:
|
||||
try:
|
||||
logging.info(f"设备 {self.device_id} 开始处理断点 '{breakpoint_name}' 的上传")
|
||||
# 从当前页面获取断点列表名称
|
||||
current_breakpoint_list = self.upload_config_page.get_breakpoint_list_from_page()
|
||||
attempt_count += 1
|
||||
if current_breakpoint_list is None:
|
||||
logging.warning(f"设备 {self.device_id} 没有获取到断点列表,结束上传流程")
|
||||
break
|
||||
|
||||
# 安全地获取断点信息
|
||||
line_num = global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT.get(breakpoint_name)
|
||||
if line_num is None:
|
||||
logging.warning(f"设备 {self.device_id} 断点 '{breakpoint_name}' 在字典中未找到,跳过上传")
|
||||
continue
|
||||
if not line_num:
|
||||
logging.warning(f"设备 {self.device_id} 断点 '{breakpoint_name}' 未获取到line_num,跳过上传")
|
||||
continue
|
||||
logging.info(f"第 {attempt_count} 次获取断点列表: {current_breakpoint_list}")
|
||||
|
||||
# 执行上传配置管理,传入当前断点名称
|
||||
if self.upload_config_page.upload_config_page_manager(self.results_dir, breakpoint_name, line_num):
|
||||
logging.info(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传成功")
|
||||
upload_success_count += 1
|
||||
else:
|
||||
logging.error(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传失败")
|
||||
# 检查是否与上一次获取的列表相同
|
||||
if previous_breakpoint_list is not None and current_breakpoint_list == previous_breakpoint_list:
|
||||
logging.info("连续两次获取到相同的断点列表,结束上传")
|
||||
# 下滑一次再次检查是否一致
|
||||
# 获取列表容器
|
||||
list_container = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/upload_result_list")
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"设备 {self.device_id} 处理断点 '{breakpoint_name}' 时发生异常: {str(e)}")
|
||||
# 计算滑动坐标
|
||||
start_x = list_container.location['x'] + list_container.size['width'] // 2
|
||||
# 向下滑动
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.95
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.05
|
||||
logging.info("向下滑动列表")
|
||||
self.driver.swipe(start_x, start_y, start_x, end_y, 500)
|
||||
current_breakpoint_list = self.upload_config_page.get_breakpoint_list_from_page()
|
||||
if previous_breakpoint_list is not None and current_breakpoint_list == previous_breakpoint_list:
|
||||
break
|
||||
|
||||
logging.info(f"设备 {self.device_id} 上传配置管理执行完成,成功上传 {upload_success_count}/{len(global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST)} 个断点")
|
||||
previous_breakpoint_list = current_breakpoint_list.copy() if current_breakpoint_list else None
|
||||
# 遍历当前页面列表,逐个执行上传操作
|
||||
|
||||
for breakpoint_name in current_breakpoint_list:
|
||||
|
||||
# # 遍历断点列表,逐个执行上传操作
|
||||
# upload_success_count = 0
|
||||
# for breakpoint_name in global_variable.get_upload_breakpoint_list():
|
||||
try:
|
||||
# 检查断点名称是否在当前页面列表中
|
||||
if breakpoint_name not in current_breakpoint_list:
|
||||
logging.warning(f"设备 {self.device_id} 断点 '{breakpoint_name}' 不在当前页面列表中,跳过上传")
|
||||
continue
|
||||
|
||||
logging.info(f"设备 {self.device_id} 开始处理断点 '{breakpoint_name}' 的上传")
|
||||
|
||||
# 安全地获取断点信息
|
||||
# breakpoint_names = global_variable.get_upload_breakpoint_dict()
|
||||
# logging.info(f"设备 {self.device_id} 断点字典 '{breakpoint_names}' 中包含断点 '{breakpoint_name}'")
|
||||
ui_breakpoint_dict = {}
|
||||
for key, value in global_variable.get_upload_breakpoint_dict().items():
|
||||
# 去掉末尾的"-平原"
|
||||
if key.endswith('-平原'):
|
||||
ui_key = key[:-3] # 去掉最后3个字符"-平原"
|
||||
else:
|
||||
ui_key = key
|
||||
ui_breakpoint_dict[ui_key] = value
|
||||
|
||||
line_num = ui_breakpoint_dict.get(breakpoint_name)
|
||||
logging.info(f"设备 {self.device_id} 断点 '{breakpoint_name}' 对应的line_num为 {line_num}")
|
||||
|
||||
if line_num is None:
|
||||
logging.warning(f"设备 {self.device_id} 断点 '{breakpoint_name}' 在字典中未找到,跳过上传")
|
||||
continue
|
||||
if not line_num:
|
||||
logging.warning(f"设备 {self.device_id} 断点 '{breakpoint_name}' 未获取到line_num,跳过上传")
|
||||
continue
|
||||
|
||||
# 执行上传配置管理,传入当前断点名称
|
||||
if self.upload_config_page.upload_config_page_manager(self.results_dir, breakpoint_name, line_num):
|
||||
logging.info(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传成功")
|
||||
upload_success_count += 1
|
||||
else:
|
||||
logging.error(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传失败")
|
||||
for i in range(3):
|
||||
if self.upload_config_page.upload_config_page_manager(self.results_dir, breakpoint_name, line_num):
|
||||
logging.info(f"设备 {self.device_id} 断点 '{breakpoint_name}' 重试上传成功")
|
||||
upload_success_count += 1
|
||||
break
|
||||
else:
|
||||
logging.error(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传失败,第 {i+1} 次重试")
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"设备 {self.device_id} 处理断点 '{breakpoint_name}' 时发生异常: {str(e)}")
|
||||
|
||||
logging.info(f"设备 {self.device_id} 上传配置管理执行完成,成功上传 {upload_success_count}/{len(global_variable.get_upload_breakpoint_list())} 个断点")
|
||||
|
||||
# 如果所有断点都上传成功,返回True;否则返回False
|
||||
all_upload_success = upload_success_count == len(global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST)
|
||||
all_upload_success = upload_success_count == len(global_variable.get_upload_breakpoint_list())
|
||||
if all_upload_success:
|
||||
logging.info(f"设备 {self.device_id} 所有断点上传成功")
|
||||
# 把上传成功的断点写入日志文件"上传成功的断点.txt"
|
||||
with open(os.path.join(self.results_dir, "上传成功的断点.txt"), "w", encoding='utf-8') as f:
|
||||
for bp in global_variable.GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST:
|
||||
for bp in global_variable.get_upload_success_breakpoint_list():
|
||||
f.write(f"{bp}\n")
|
||||
else:
|
||||
logging.warning(f"设备 {self.device_id} 部分断点上传失败")
|
||||
# 把上传成功的断点写入日志文件"上传成功的断点.txt"
|
||||
with open(os.path.join(self.results_dir, "上传成功的断点.txt"), "w", encoding='utf-8') as f:
|
||||
for bp in global_variable.GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST:
|
||||
for bp in global_variable.get_upload_success_breakpoint_list():
|
||||
f.write(f"{bp}\n")
|
||||
# 把上传失败的断点写入日志文件"上传失败的断点.txt"
|
||||
with open(os.path.join(self.results_dir, "上传失败的断点.txt"), "w", encoding='utf-8') as f:
|
||||
for bp in set(global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST)-set(global_variable.GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST):
|
||||
for bp in set(global_variable.get_upload_breakpoint_list())-set(global_variable.get_upload_success_breakpoint_list()):
|
||||
f.write(f"{bp}\n")
|
||||
|
||||
return all_upload_success
|
||||
@@ -457,13 +379,48 @@ class DeviceAutomation:
|
||||
"""关闭驱动"""
|
||||
safe_quit_driver(getattr(self, 'driver', None), self.device_id)
|
||||
|
||||
@staticmethod
|
||||
def start_upload(device_id=None, upload_time=None):
|
||||
"""
|
||||
供其他页面或模块调用的静态方法
|
||||
执行完整的自动化流程
|
||||
|
||||
参数:
|
||||
device_id: 可选的设备ID,如果为None则自动获取
|
||||
|
||||
返回:
|
||||
bool: 自动化流程执行结果(True/False)
|
||||
"""
|
||||
automation = None
|
||||
try:
|
||||
# 创建自动化实例
|
||||
automation = DeviceAutomation(device_id=device_id)
|
||||
|
||||
# 执行自动化流程
|
||||
success = automation.run_automation()
|
||||
|
||||
if success:
|
||||
logging.info("自动化流程执行成功")
|
||||
else:
|
||||
logging.error("自动化流程执行失败")
|
||||
|
||||
return success
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"自动化流程执行出错: {str(e)}")
|
||||
return False
|
||||
finally:
|
||||
# 确保资源被清理
|
||||
if automation:
|
||||
automation.quit()
|
||||
|
||||
# 主执行逻辑
|
||||
if __name__ == "__main__":
|
||||
|
||||
# 单个设备配置 - 现在DeviceAutomation会自动获取设备ID
|
||||
|
||||
try:
|
||||
automation = DeviceAutomation()
|
||||
automation = DeviceAutomation(device_id="192.168.1.100:5556")
|
||||
success = automation.run_automation()
|
||||
|
||||
if success:
|
||||
|
||||
BIN
music/901135.wav
BIN
music/901135.wav
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,46 +0,0 @@
|
||||
import socket
|
||||
|
||||
def send_tcp_command(command: str, host: str = '127.0.0.1', port: int = 8888, encoding: str = 'utf-8') -> bool:
|
||||
"""
|
||||
向指定TCP端口发送指令
|
||||
|
||||
参数:
|
||||
command: 要发送的指令字符串
|
||||
host: 目标主机地址(默认127.0.0.1)
|
||||
port: 目标端口(默认8888)
|
||||
encoding: 字符串编码格式(默认utf-8)
|
||||
|
||||
返回:
|
||||
发送成功返回True,失败返回False
|
||||
"""
|
||||
# 创建TCP socket并自动关闭(with语句确保资源释放)
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
||||
try:
|
||||
# 连接服务器(超时时间5秒,避免无限阻塞)
|
||||
sock.settimeout(5.0)
|
||||
sock.connect((host, port))
|
||||
|
||||
# 发送指令(转换为字节流)
|
||||
sock.sendall(command.encode(encoding))
|
||||
print(f"指令 '{command}' 发送成功")
|
||||
return True
|
||||
|
||||
except ConnectionRefusedError:
|
||||
print(f"连接失败:{host}:{port} 未监听或不可达")
|
||||
except socket.timeout:
|
||||
print(f"连接超时:超过5秒未连接到 {host}:{port}")
|
||||
except UnicodeEncodeError:
|
||||
print(f"编码失败:指令包含{encoding}无法编码的字符")
|
||||
except Exception as e:
|
||||
print(f"发送失败:{str(e)}")
|
||||
|
||||
return False
|
||||
|
||||
|
||||
# 使用示例
|
||||
if __name__ == "__main__":
|
||||
# 发送StartConnect指令
|
||||
send_tcp_command("StartConnect")
|
||||
|
||||
# 也可以发送其他指令,例如:
|
||||
# send_tcp_command("StopConnect")
|
||||
@@ -295,25 +295,25 @@ class DownloadTabbarPage:
|
||||
"""执行基础更新操作"""
|
||||
try:
|
||||
# 执行基础更新流程
|
||||
self.logger.info(f"设备 {global_variable.GLOBAL_DEVICE_ID} 开始执行更新流程")
|
||||
self.logger.info(f"设备 {global_variable.get_device_id()} 开始执行更新流程")
|
||||
|
||||
# 点击下载标签栏
|
||||
if not self.click_download_tabbar():
|
||||
self.logger.error(f"设备 {global_variable.GLOBAL_DEVICE_ID} 点击下载标签栏失败")
|
||||
self.logger.error(f"设备 {global_variable.get_device_id()} 点击下载标签栏失败")
|
||||
return False
|
||||
|
||||
# 更新工作基点
|
||||
if not self.update_work_base():
|
||||
self.logger.error(f"设备 {global_variable.GLOBAL_DEVICE_ID} 更新工作基点失败")
|
||||
self.logger.error(f"设备 {global_variable.get_device_id()} 更新工作基点失败")
|
||||
return False
|
||||
|
||||
# 更新水准线路
|
||||
if not self.update_level_line():
|
||||
self.logger.error(f"设备 {global_variable.GLOBAL_DEVICE_ID} 更新水准线路失败")
|
||||
self.logger.error(f"设备 {global_variable.get_device_id()} 更新水准线路失败")
|
||||
return False
|
||||
|
||||
self.logger.info(f"设备 {global_variable.GLOBAL_DEVICE_ID} 更新操作执行成功")
|
||||
self.logger.info(f"设备 {global_variable.get_device_id()} 更新操作执行成功")
|
||||
return True
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {global_variable.GLOBAL_DEVICE_ID} 执行更新操作时出错: {str(e)}")
|
||||
self.logger.error(f"设备 {global_variable.get_device_id()} 执行更新操作时出错: {str(e)}")
|
||||
return False
|
||||
@@ -6,6 +6,7 @@ from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.common.exceptions import TimeoutException, NoSuchElementException
|
||||
import logging
|
||||
import time
|
||||
import globals.apis as apis
|
||||
|
||||
import globals.ids as ids
|
||||
import globals.global_variable as global_variable # 导入全局变量模块
|
||||
@@ -36,7 +37,8 @@ class LoginPage:
|
||||
# 读取文本框内已有的用户名(.text属性获取元素显示的文本内容)
|
||||
existing_username = username_field.text
|
||||
# 3. 将获取到的用户名写入全局变量中
|
||||
global_variable.GLOBAL_USERNAME = existing_username # 关键:给全局变量赋值
|
||||
# global_variable.GLOBAL_USERNAME = existing_username # 关键:给全局变量赋值
|
||||
global_variable.set_username(existing_username)
|
||||
|
||||
# 日志记录获取到的已有用户名(若为空,也需明确记录,避免后续误解)
|
||||
if existing_username.strip(): # 去除空格后判断是否有有效内容
|
||||
@@ -44,23 +46,59 @@ class LoginPage:
|
||||
else:
|
||||
self.logger.info("文本框中未检测到已有用户名(内容为空)")
|
||||
|
||||
# 点击登录按钮
|
||||
login_btn = self.wait.until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, ids.LOGIN_BTN))
|
||||
# 1. 定位密码输入框
|
||||
password_field = self.wait.until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, ids.LOGIN_PASSWORD))
|
||||
)
|
||||
login_btn.click()
|
||||
self.logger.info("已点击登录按钮")
|
||||
|
||||
# 等待登录完成
|
||||
time.sleep(3)
|
||||
# 2. 清空密码框(如果需要)
|
||||
try:
|
||||
password_field.clear()
|
||||
# time.sleep(0.5) # 等待清除完成
|
||||
except:
|
||||
# 如果clear方法不可用,尝试其他方式
|
||||
pass
|
||||
|
||||
# 检查是否登录成功
|
||||
if self.is_login_successful():
|
||||
self.logger.info("登录成功")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning("登录后未检测到主页面元素")
|
||||
return False
|
||||
accounts = apis.get_accounts_from_server("68ef0e02b0138d25e2ac9918")
|
||||
matches = [acc for acc in accounts if acc.get("username") == existing_username]
|
||||
if matches:
|
||||
password = matches[0].get("password")
|
||||
|
||||
password_field.send_keys(password)
|
||||
|
||||
# 4. 可选:隐藏键盘
|
||||
try:
|
||||
self.driver.hide_keyboard()
|
||||
except:
|
||||
pass
|
||||
|
||||
# 点击登录按钮
|
||||
max_retries = 3
|
||||
retry_count = 0
|
||||
|
||||
while retry_count < max_retries:
|
||||
login_btn = self.wait.until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, ids.LOGIN_BTN))
|
||||
)
|
||||
login_btn.click()
|
||||
self.logger.info(f"已点击登录按钮 (尝试 {retry_count + 1}/{max_retries})")
|
||||
|
||||
# 等待登录完成
|
||||
time.sleep(3)
|
||||
|
||||
# 检查是否登录成功
|
||||
if self.is_login_successful():
|
||||
self.logger.info("登录成功")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning("登录后未检测到主页面元素,准备重试")
|
||||
retry_count += 1
|
||||
if retry_count < max_retries:
|
||||
self.logger.info(f"等待2秒后重新尝试登录...")
|
||||
time.sleep(2)
|
||||
|
||||
self.logger.error(f"登录失败,已尝试 {max_retries} 次")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"登录过程中出错: {str(e)}")
|
||||
|
||||
@@ -5,6 +5,7 @@ from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.common.exceptions import TimeoutException, NoSuchElementException
|
||||
import logging
|
||||
import time
|
||||
from datetime import datetime
|
||||
from globals.driver_utils import launch_app_manually
|
||||
from page_objects.login_page import LoginPage
|
||||
|
||||
@@ -177,12 +178,43 @@ class MoreDownloadPage:
|
||||
def _swipe_year_wheel(self):
|
||||
"""滑动年份选择器的滚轮"""
|
||||
try:
|
||||
# 获取年份选择器滚轮元素
|
||||
year_wheel = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/wheelView2")
|
||||
# # 获取年份选择器滚轮元素
|
||||
# year_wheel = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/wheelView1")
|
||||
# 获取当前日期
|
||||
current_date = datetime.now()
|
||||
current_month = current_date.month
|
||||
|
||||
# 检查月份是否小于等于3
|
||||
if current_month <= 3:
|
||||
self.logger.info(f"当前月份为{current_month}月,需要滑动年份选择器")
|
||||
|
||||
# 获取年份选择器滚轮元素
|
||||
year_wheel = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/wheelView1")
|
||||
|
||||
# 获取滚轮的位置和尺寸
|
||||
location = year_wheel.location
|
||||
size = year_wheel.size
|
||||
|
||||
# 计算滚轮中心点坐标
|
||||
center_x = location['x'] + size['width'] // 2
|
||||
center_y = location['y'] + size['height'] // 2
|
||||
|
||||
# 计算滑动距离 - 滚轮高度的1/5
|
||||
swipe_distance = size['height'] // 5
|
||||
|
||||
# 滑动一次年份选择器
|
||||
# 执行滑动操作 - 从中心向上滑动1/5高度
|
||||
self.driver.swipe(center_x, center_y - swipe_distance, center_x, center_y, 500)
|
||||
|
||||
self.logger.info("已滑动一次年份选择器")
|
||||
else:
|
||||
self.logger.info(f"当前月份为{current_month}月,不需要滑动年份选择器")
|
||||
# 获取月份选择器滚轮元素
|
||||
month_wheel = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/wheelView2")
|
||||
|
||||
# 获取滚轮的位置和尺寸
|
||||
location = year_wheel.location
|
||||
size = year_wheel.size
|
||||
location = month_wheel.location
|
||||
size = month_wheel.size
|
||||
|
||||
# 计算滚轮中心点坐标
|
||||
center_x = location['x'] + size['width'] // 2
|
||||
@@ -369,7 +401,7 @@ class MoreDownloadPage:
|
||||
continue
|
||||
return False
|
||||
|
||||
def wait_for_loading_dialog(self, timeout=900, download_type="unknown", retry_count=0):
|
||||
def wait_for_loading_dialog(self, timeout=1200, download_type="unknown", retry_count=0):
|
||||
"""
|
||||
检查加载弹窗的出现和消失,支持最多1次重试(总共执行2次)
|
||||
"""
|
||||
|
||||
@@ -5,6 +5,7 @@ import time
|
||||
import re
|
||||
import os
|
||||
from datetime import datetime
|
||||
from turtle import back
|
||||
from appium.webdriver.common.appiumby import AppiumBy
|
||||
from selenium.common.exceptions import NoSuchElementException, TimeoutException
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
@@ -19,7 +20,8 @@ import globals.global_variable as global_variable # 导入全局变量模块
|
||||
class ScreenshotPage:
|
||||
def __init__(self, driver, wait, device_id=None):
|
||||
self.driver = driver
|
||||
self.wait = wait
|
||||
# self.wait = wait
|
||||
self.wait = WebDriverWait(self.driver, 0.5)
|
||||
self.device_id = device_id
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self.all_items = set()
|
||||
@@ -42,19 +44,19 @@ class ScreenshotPage:
|
||||
|
||||
if direction == "down":
|
||||
# 向下滑动
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.95
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.05
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.90
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.1
|
||||
self.logger.info("向下滑动列表")
|
||||
else:
|
||||
# 向上滑动
|
||||
# 记录滑动前的项目,用于判断是否滑动到顶
|
||||
before_scroll_items = self.get_current_items()
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.05
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.95
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.1
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.90
|
||||
self.logger.info("向上滑动列表")
|
||||
|
||||
# 执行滑动
|
||||
self.driver.swipe(start_x, start_y, start_x, end_y, 1000)
|
||||
self.driver.swipe(start_x, start_y, start_x, end_y, 500)
|
||||
|
||||
|
||||
# 向上滑动时,检查是否滑动到顶
|
||||
@@ -233,7 +235,7 @@ class ScreenshotPage:
|
||||
def check_apply_btn(self):
|
||||
"""检查是否有平差处理按钮"""
|
||||
try:
|
||||
apply_btn = WebDriverWait(self.driver, 5).until(
|
||||
apply_btn = WebDriverWait(self.driver, 1).until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/point_measure_btn"))
|
||||
)
|
||||
if apply_btn.is_displayed():
|
||||
@@ -258,8 +260,8 @@ class ScreenshotPage:
|
||||
tuple: (date_str, time_str) 日期和时间字符串
|
||||
"""
|
||||
|
||||
if line_code in global_variable.LINE_TIME_MAPPING_DICT:
|
||||
end_time = global_variable.LINE_TIME_MAPPING_DICT[line_code]
|
||||
if line_code in global_variable.get_line_time_mapping_dict():
|
||||
end_time = global_variable.get_line_time_mapping_dict()[line_code]
|
||||
date_str = end_time.strftime("%Y-%m-%d")
|
||||
time_str = end_time.strftime("%H:%M:%S")
|
||||
return (date_str, time_str)
|
||||
@@ -273,19 +275,19 @@ class ScreenshotPage:
|
||||
"""
|
||||
|
||||
self.logger.info("\n当前全局字典内容:")
|
||||
if global_variable.LINE_TIME_MAPPING_DICT:
|
||||
for line_code, end_time in sorted(global_variable.LINE_TIME_MAPPING_DICT.items()):
|
||||
if global_variable.get_line_time_mapping_dict():
|
||||
for line_code, end_time in sorted(global_variable.get_line_time_mapping_dict().items()):
|
||||
date_str = end_time.strftime("%Y-%m-%d")
|
||||
time_str = end_time.strftime("%H:%M:%S")
|
||||
self.logger.info(f" {line_code}: {date_str} {time_str}")
|
||||
else:
|
||||
self.logger.info(" 全局字典为空")
|
||||
self.logger.info(f"总计: {len(global_variable.LINE_TIME_MAPPING_DICT)} 条记录\n")
|
||||
self.logger.info(f"总计: {len(global_variable.get_line_time_mapping_dict())} 条记录\n")
|
||||
def clear_line_time_mapping(self):
|
||||
"""
|
||||
清空全局字典
|
||||
"""
|
||||
global_variable.LINE_TIME_MAPPING_DICT.clear()
|
||||
global_variable.get_line_time_mapping_dict().clear()
|
||||
self.logger.info("已清空全局字典")
|
||||
|
||||
def set_device_time(self, device_id, time_str=None, date_str=None, disable_auto_sync=True):
|
||||
@@ -548,117 +550,6 @@ class ScreenshotPage:
|
||||
self.logger.error(f"截图时发生错误: {str(e)}")
|
||||
return False
|
||||
|
||||
def wait_for_measurement_end(self, timeout=900):
|
||||
"""
|
||||
等待按钮变成"测量结束",最多15分钟,包含驱动重新初始化机制
|
||||
|
||||
Args:
|
||||
timeout: 超时时间,默认900秒(15分钟)
|
||||
|
||||
Returns:
|
||||
bool: 是否成功等到测量结束按钮
|
||||
"""
|
||||
try:
|
||||
# 更新WebDriverWait等待时间为900秒
|
||||
self.wait = WebDriverWait(self.driver, 900)
|
||||
self.logger.info(f"设备等待测量结束按钮出现,最多等待 {timeout} 秒")
|
||||
|
||||
start_time = time.time()
|
||||
reinit_attempts = 0
|
||||
max_reinit_attempts = 3 # 最大重新初始化次数
|
||||
|
||||
while time.time() - start_time < timeout:
|
||||
try:
|
||||
# 使用XPath查找文本为"测量结束"的按钮
|
||||
measurement_end_button = self.driver.find_element(
|
||||
AppiumBy.XPATH,
|
||||
"//android.widget.Button[@text='测量结束']"
|
||||
)
|
||||
|
||||
if measurement_end_button.is_displayed() and measurement_end_button.is_enabled():
|
||||
self.logger.info(f"设备检测到测量结束按钮")
|
||||
return True
|
||||
|
||||
except NoSuchElementException:
|
||||
# 按钮未找到,继续等待
|
||||
pass
|
||||
except Exception as e:
|
||||
error_msg = str(e)
|
||||
self.logger.warning(f"设备查找测量结束按钮时出现异常: {error_msg}")
|
||||
|
||||
# 检测是否是UiAutomator2服务崩溃
|
||||
if 'UiAutomator2 server' in error_msg and 'instrumentation process is not running' in error_msg and reinit_attempts < max_reinit_attempts:
|
||||
reinit_attempts += 1
|
||||
self.logger.info(f"设备检测到UiAutomator2服务崩溃,尝试第 {reinit_attempts} 次重新初始化驱动")
|
||||
|
||||
# 尝试重新初始化驱动
|
||||
if self._reinit_driver():
|
||||
self.logger.info(f"设备驱动重新初始化成功")
|
||||
else:
|
||||
self.logger.error(f"设备驱动重新初始化失败")
|
||||
# 继续尝试,而不是立即失败
|
||||
|
||||
# 等待一段时间后再次检查
|
||||
time.sleep(3)
|
||||
|
||||
# 每30秒输出一次等待状态
|
||||
if int(time.time() - start_time) % 30 == 0:
|
||||
elapsed = int(time.time() - start_time)
|
||||
self.logger.info(f"设备 {self.device_id} 已等待 {elapsed} 秒,仍在等待测量结束...")
|
||||
|
||||
self.logger.error(f"设备 {self.device_id} 等待测量结束按钮超时")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {self.device_id} 等待测量结束时发生错误: {str(e)}")
|
||||
return False
|
||||
|
||||
def _reinit_driver(self):
|
||||
"""
|
||||
重新初始化Appium驱动
|
||||
|
||||
Returns:
|
||||
bool: 是否成功重新初始化
|
||||
"""
|
||||
try:
|
||||
# 首先尝试关闭现有的驱动
|
||||
if hasattr(self, 'driver') and self.driver:
|
||||
try:
|
||||
self.driver.quit()
|
||||
except:
|
||||
self.logger.warning("关闭现有驱动时出现异常")
|
||||
|
||||
# 导入必要的模块
|
||||
from appium import webdriver
|
||||
from appium.options.android import UiAutomator2Options
|
||||
|
||||
# 重新创建驱动配置
|
||||
options = UiAutomator2Options()
|
||||
options.platform_name = "Android"
|
||||
options.device_name = self.device_id
|
||||
options.app_package = "com.bjjw.cjgc"
|
||||
options.app_activity = ".activity.LoginActivity"
|
||||
options.automation_name = "UiAutomator2"
|
||||
options.no_reset = True
|
||||
options.auto_grant_permissions = True
|
||||
options.new_command_timeout = 300
|
||||
options.udid = self.device_id
|
||||
|
||||
# 重新连接驱动
|
||||
self.logger.info(f"正在重新初始化设备 {self.device_id} 的驱动...")
|
||||
self.driver = webdriver.Remote("http://localhost:4723", options=options)
|
||||
|
||||
# 重新初始化等待对象
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
self.wait = WebDriverWait(self.driver, 1)
|
||||
|
||||
self.logger.info(f"设备 {self.device_id} 驱动重新初始化完成")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {self.device_id} 驱动重新初始化失败: {str(e)}")
|
||||
return False
|
||||
|
||||
def handle_confirmation_dialog(self, device_id, timeout=2):
|
||||
"""
|
||||
处理确认弹窗,点击"是"按钮
|
||||
@@ -672,31 +563,68 @@ class ScreenshotPage:
|
||||
"""
|
||||
# 等待弹窗出现(最多等待2秒)
|
||||
try:
|
||||
dialog_message = WebDriverWait(self.driver, timeout).until(
|
||||
EC.presence_of_element_located((AppiumBy.XPATH, "//android.widget.TextView[@text='是否退出测量界面?']"))
|
||||
)
|
||||
# dialog_message = WebDriverWait(self.driver, timeout).until(
|
||||
# EC.presence_of_element_located((AppiumBy.XPATH, "//android.widget.TextView[@text='是否退出测量界面?']"))
|
||||
# )
|
||||
|
||||
self.logger.info(f"设备 {device_id} 检测到确认弹窗")
|
||||
# self.logger.info(f"设备 {device_id} 检测到确认弹窗")
|
||||
|
||||
# 查找并点击"是"按钮
|
||||
confirm_button = self.driver.find_element(
|
||||
AppiumBy.XPATH,
|
||||
"//android.widget.Button[@text='是' and @resource-id='android:id/button1']"
|
||||
)
|
||||
# # 查找并点击"是"按钮
|
||||
# confirm_button = self.driver.find_element(
|
||||
# AppiumBy.XPATH,
|
||||
# "//android.widget.Button[@text='是' and @resource-id='android:id/button1']"
|
||||
# )
|
||||
|
||||
if confirm_button.is_displayed() and confirm_button.is_enabled():
|
||||
self.logger.info(f"设备 {device_id} 点击确认弹窗的'是'按钮")
|
||||
confirm_button.click()
|
||||
time.sleep(0.5)
|
||||
return True
|
||||
else:
|
||||
self.logger.error(f"设备 {device_id} '是'按钮不可点击")
|
||||
return False
|
||||
# if confirm_button.is_displayed() and confirm_button.is_enabled():
|
||||
# self.logger.info(f"设备 {device_id} 点击确认弹窗的'是'按钮")
|
||||
# confirm_button.click()
|
||||
# time.sleep(0.5)
|
||||
# return True
|
||||
# else:
|
||||
# self.logger.error(f"设备 {device_id} '是'按钮不可点击")
|
||||
# return False
|
||||
|
||||
except TimeoutException:
|
||||
# 超时未找到弹窗,认为没有弹窗,返回成功
|
||||
self.logger.info(f"设备 {device_id} 等待 {timeout} 秒未发现确认弹窗,可能没有弹窗,返回成功")
|
||||
return True
|
||||
# except TimeoutException:
|
||||
# # 超时未找到弹窗,认为没有弹窗,返回成功
|
||||
# self.logger.info(f"设备 {device_id} 等待 {timeout} 秒未发现确认弹窗,可能没有弹窗,返回成功")
|
||||
# return True
|
||||
max_attempts = 2
|
||||
for attempt in range(max_attempts):
|
||||
try:
|
||||
dialog_message = WebDriverWait(self.driver, timeout).until(
|
||||
EC.presence_of_element_located((AppiumBy.XPATH, "//android.widget.TextView[@text='是否退出测量界面?']"))
|
||||
)
|
||||
|
||||
self.logger.info(f"设备 {device_id} 检测到确认弹窗 (第 {attempt + 1} 次)")
|
||||
|
||||
# 查找并点击"是"按钮
|
||||
confirm_button = self.driver.find_element(
|
||||
AppiumBy.XPATH,
|
||||
"//android.widget.Button[@text='是' and @resource-id='android:id/button1']"
|
||||
)
|
||||
|
||||
if confirm_button.is_displayed() and confirm_button.is_enabled():
|
||||
self.logger.info(f"设备 {device_id} 点击确认弹窗的'是'按钮 (第 {attempt + 1} 次)")
|
||||
confirm_button.click()
|
||||
time.sleep(0.5)
|
||||
|
||||
# 如果是第一次尝试,继续检查是否还有弹窗
|
||||
if attempt < max_attempts - 1:
|
||||
self.logger.info(f"设备 {device_id} 等待 1 秒后检查是否还有弹窗")
|
||||
time.sleep(0.5)
|
||||
continue
|
||||
return True
|
||||
else:
|
||||
self.logger.error(f"设备 {device_id} '是'按钮不可点击")
|
||||
return False
|
||||
except TimeoutException:
|
||||
# 超时未找到弹窗,认为没有弹窗,返回成功
|
||||
self.logger.info(f"设备 {device_id} 等待 {timeout} 秒未发现确认弹窗,可能没有弹窗,返回成功")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {device_id} 处理确认弹窗时出错: {str(e)}")
|
||||
return False
|
||||
|
||||
def click_back_button(self, device_id):
|
||||
"""点击手机系统返回按钮"""
|
||||
@@ -765,7 +693,7 @@ class ScreenshotPage:
|
||||
if confirm_button and confirm_button.is_displayed() and confirm_button.is_enabled():
|
||||
self.logger.info(f"设备 {device_id} 点击确认弹窗的'是'按钮")
|
||||
confirm_button.click()
|
||||
time.sleep(1)
|
||||
time.sleep(0.5)
|
||||
|
||||
# 验证弹窗是否消失
|
||||
try:
|
||||
@@ -785,7 +713,7 @@ class ScreenshotPage:
|
||||
except Exception as e:
|
||||
self.logger.warning(f"设备 {device_id} 查找确认弹窗时出现异常: {str(e)}")
|
||||
|
||||
time.sleep(1)
|
||||
time.sleep(0.5)
|
||||
|
||||
self.logger.error(f"设备 {device_id} 等待返回确认弹窗超时")
|
||||
return False
|
||||
@@ -884,7 +812,7 @@ class ScreenshotPage:
|
||||
# time.sleep(2)
|
||||
self.logger.info(f"已点击平差处理按钮,检查是否在测量页面")
|
||||
|
||||
# 检测是否存在测量列表(修正逻辑)
|
||||
# 检测是否存在测量列表
|
||||
has_measurement_list = self.check_measurement_list(device_id)
|
||||
if not has_measurement_list:
|
||||
self.logger.info(f"设备 {device_id} 存在测量列表,重新执行平差流程")
|
||||
@@ -939,11 +867,11 @@ class ScreenshotPage:
|
||||
self.logger.info(f"已点击返回按钮,等待处理返回确认弹窗")
|
||||
if not self.handle_confirmation_dialog(device_id):
|
||||
self.logger.error(f"设备 {device_id} 处理返回确认弹窗失败")
|
||||
return False
|
||||
# return False
|
||||
|
||||
|
||||
# 3. 验证是否成功返回到上一页面
|
||||
time.sleep(1) # 等待页面跳转完成
|
||||
time.sleep(0.5) # 等待页面跳转完成
|
||||
|
||||
# 可以添加页面验证逻辑,比如检查是否返回到预期的页面
|
||||
# 这里可以根据实际应用添加特定的页面元素验证
|
||||
@@ -967,7 +895,7 @@ class ScreenshotPage:
|
||||
"""
|
||||
try:
|
||||
self.logger.info(f"设备 {device_id} 开始执行测量结束后的操作流程")
|
||||
time.sleep(5)
|
||||
time.sleep(0.5)
|
||||
|
||||
# 1. 下滑列表到最底端
|
||||
if not self.scroll_list_to_bottom(device_id):
|
||||
@@ -988,11 +916,6 @@ class ScreenshotPage:
|
||||
self.logger.error(f"设备 {device_id} 点击平差处理按钮失败")
|
||||
return False
|
||||
|
||||
# # 5. 在点击平差处理按钮后截图
|
||||
# time.sleep(2) # 等待平差处理按钮点击后的界面变化
|
||||
# if not self.take_screenshot("after_adjustment_button_click"):
|
||||
# self.logger.error(f"设备 {device_id} 截图失败")
|
||||
# return False
|
||||
|
||||
self.logger.info(f"设备 {device_id} 测量结束后操作流程完成")
|
||||
return True
|
||||
@@ -1071,7 +994,7 @@ class ScreenshotPage:
|
||||
if self.click_last_spinner(device_id):
|
||||
return True
|
||||
self.logger.warning(f"设备 {device_id} 第{attempt + 1}次点击失败,准备重试")
|
||||
time.sleep(1) # 重试前等待
|
||||
time.sleep(0.5) # 重试前等待
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {device_id} 第{attempt + 1}次尝试失败: {str(e)}")
|
||||
|
||||
@@ -1121,10 +1044,10 @@ class ScreenshotPage:
|
||||
# 确保device_id正确设置,使用全局变量作为备用
|
||||
if not hasattr(self, 'device_id') or not self.device_id:
|
||||
# 优先使用传入的device_id,其次使用全局变量
|
||||
self.device_id = device_id if device_id else global_variable.GLOBAL_DEVICE_ID
|
||||
self.device_id = device_id if device_id else global_variable.get_device_id()
|
||||
|
||||
# 使用self.device_id,确保有默认值
|
||||
actual_device_id = self.device_id if self.device_id else global_variable.GLOBAL_DEVICE_ID
|
||||
actual_device_id = self.device_id if self.device_id else global_variable.get_device_id()
|
||||
|
||||
if not check_session_valid(self.driver, actual_device_id):
|
||||
self.logger.warning(f"设备 {actual_device_id} 会话无效,尝试重新连接驱动...")
|
||||
@@ -1133,7 +1056,8 @@ class ScreenshotPage:
|
||||
new_driver, new_wait = reconnect_driver(actual_device_id, self.driver)
|
||||
if new_driver:
|
||||
self.driver = new_driver
|
||||
self.wait = new_wait
|
||||
# self.wait = new_wait
|
||||
self.wait = WebDriverWait(self.driver, 2)
|
||||
self.logger.info(f"设备 {actual_device_id} 驱动重连成功")
|
||||
else:
|
||||
self.logger.error(f"设备 {actual_device_id} 驱动重连失败")
|
||||
@@ -1189,8 +1113,8 @@ class ScreenshotPage:
|
||||
|
||||
retry_count += 1
|
||||
if retry_count < max_retries:
|
||||
self.logger.info(f"设备 {device_id} 将在1秒后进行第{retry_count+1}次重试")
|
||||
time.sleep(1) # 等待1秒后重试
|
||||
self.logger.info(f"设备 {device_id} 将在0.5秒后进行第{retry_count+1}次重试")
|
||||
time.sleep(0.5) # 等待0.5秒后重试
|
||||
|
||||
self.logger.error(f"设备 {device_id} 经过{max_retries}次重试后仍无法展开下拉菜单")
|
||||
return False
|
||||
@@ -1222,7 +1146,7 @@ class ScreenshotPage:
|
||||
'percent': 0.5
|
||||
})
|
||||
|
||||
time.sleep(1)
|
||||
time.sleep(0.5)
|
||||
self.logger.info(f"设备 {device_id} 额外下滑完成")
|
||||
return True
|
||||
|
||||
@@ -1269,9 +1193,9 @@ class ScreenshotPage:
|
||||
|
||||
def add_breakpoint_to_upload_list(self, breakpoint_name, line_num):
|
||||
"""添加平差完成的断点到上传列表和字典"""
|
||||
if breakpoint_name and breakpoint_name not in global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST:
|
||||
global_variable.GLOBAL_UPLOAD_BREAKPOINT_LIST.append(breakpoint_name)
|
||||
global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT[breakpoint_name] = {
|
||||
if breakpoint_name and breakpoint_name not in global_variable.get_upload_breakpoint_list():
|
||||
global_variable.get_upload_breakpoint_list().append(breakpoint_name)
|
||||
global_variable.get_upload_breakpoint_dict()[breakpoint_name] = {
|
||||
'breakpoint_name': breakpoint_name,
|
||||
'line_num': line_num
|
||||
}
|
||||
@@ -1342,83 +1266,128 @@ class ScreenshotPage:
|
||||
return False
|
||||
|
||||
# 检查GLOBAL_UPLOAD_BREAKPOINT_DICT是否为空,如果为空则初始化一些测试数据
|
||||
if not global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT:
|
||||
self.logger.warning("global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT为空,正在初始化测试数据")
|
||||
global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT = {'CDWZQ-2标-龙骨湾右线大桥-0-7号墩-平原': 'L156372', 'CDWZQ-2标-蓝家湾特大 桥-31-31-平原': 'L159206'}
|
||||
if not global_variable.get_upload_breakpoint_dict():
|
||||
self.logger.warning("上传列表为空,无法执行平差操作")
|
||||
return False
|
||||
|
||||
# 创建断点列表的副本,用于重试时重新处理
|
||||
breakpoint_names = list(global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT.keys())
|
||||
processed_breakpoints = []
|
||||
# global_variable.set_upload_breakpoint_dict({'CDWZQ-2标-龙骨湾右线大桥-0-7号墩-平原': 'L156372', 'CDWZQ-2标-蓝家湾特大 桥-31-31-平原': 'L159206'})
|
||||
|
||||
breakpoint_names = list(global_variable.get_upload_breakpoint_dict().keys())
|
||||
processed_breakpoints = [] # 创建一个列表,用于记录已处理的断点
|
||||
|
||||
# 开始循环处理断点
|
||||
for breakpoint_name in breakpoint_names:
|
||||
if breakpoint_name in processed_breakpoints:
|
||||
continue
|
||||
line_code = global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT[breakpoint_name]
|
||||
# 检测当前页面获取到的标段是否在breakpoint_names中
|
||||
max_scroll_attempts = 100 # 最大滚动尝试次数
|
||||
scroll_count = 0
|
||||
previous_items = set() # 记录前一次获取的项目集合,用于检测是否到达边界
|
||||
found_any = False # 标记是否找到并处理了任何断点
|
||||
max_retry_attempts = 3 # 每个断点的最大重试次数
|
||||
|
||||
self.logger.info(f"开始处理要平差的断点 {breakpoint_name}")
|
||||
while scroll_count < max_scroll_attempts:
|
||||
# 获取当前页面中的所有项目
|
||||
current_items = self.get_current_items()
|
||||
self.logger.info(f"当前页面找到 {len(current_items)} 个项目")
|
||||
|
||||
# 把断点名称给find_keyword
|
||||
if not self.find_keyword(breakpoint_name):
|
||||
self.logger.error(f"设备 {device_id} 未找到包含 {breakpoint_name} 的文件名")
|
||||
continue # 继续处理下一个断点
|
||||
# 检查当前页面的项目是否在breakpoint_names中
|
||||
for item in current_items:
|
||||
# 检查项目是否在breakpoint_names中且未处理
|
||||
if item in breakpoint_names and item not in processed_breakpoints:
|
||||
self.logger.info(f"找到目标断点: {item}")
|
||||
found_any = True
|
||||
|
||||
if not self.handle_measurement_dialog():
|
||||
self.logger.error(f"设备 {device_id} 处理测量弹窗失败")
|
||||
# 获取线路编码
|
||||
try:
|
||||
line_code = global_variable.get_upload_breakpoint_dict()[item]
|
||||
except KeyError:
|
||||
self.logger.error(f"未找到断点 {item} 的线路编码")
|
||||
continue
|
||||
|
||||
# 重试处理断点
|
||||
retry_count = 0
|
||||
while retry_count < max_retry_attempts:
|
||||
self.logger.info(f"开始处理断点 {item} (第 {retry_count + 1} 次尝试)")
|
||||
|
||||
# 点击目标项目
|
||||
if not self.click_item_by_text(item):
|
||||
self.logger.error(f"点击目标断点失败: {item}")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
if not self.handle_measurement_dialog():
|
||||
self.logger.error(f"设备 {device_id} 处理测量弹窗失败")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
if not self.check_apply_btn():
|
||||
retry_count += 1
|
||||
self.driver.back()
|
||||
self.logger.info(f"设备 {device_id} 检查平差处理按钮失败,已点击手机系统返回按钮")
|
||||
break
|
||||
|
||||
# 点击平差处理按钮
|
||||
if not self.click_adjustment_button(device_id):
|
||||
self.logger.error(f"设备 {device_id} 点击平差处理按钮失败")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
# 检查是否在测量页面,在就重新执行选择断点,滑动列表到底部,点击最后一个spinner, 再下滑一次,点击平差处理按钮平差
|
||||
if not self.handle_back_navigation(item, device_id):
|
||||
self.logger.error(f"{item}平差失败,未截图")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
# 检测并处理"是 保留成果"弹窗
|
||||
if not self.handle_adjustment_result_dialog():
|
||||
self.logger.error("处理平差结果弹窗失败")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
# 检查在不在测量列表页面,不在就点击返回按钮并处理弹窗
|
||||
if self.check_measurement_list(device_id):
|
||||
self.logger.error(f"设备 {device_id} 未在测量列表页面")
|
||||
# 点击返回按钮并处理弹窗
|
||||
if not self.execute_back_navigation_steps(device_id):
|
||||
self.logger.error(f"设备 {device_id} 处理返回按钮确认失败")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
# 成功处理完一个断点,添加到已处理列表
|
||||
processed_breakpoints.append(item)
|
||||
# add_breakpoint_to_upload_list(item, line_code)
|
||||
self.logger.info(f"成功处理断点: {item}")
|
||||
break # 跳出重试循环
|
||||
|
||||
# 检查是否重试次数用完仍未成功
|
||||
if retry_count == max_retry_attempts-1:
|
||||
self.logger.error(f"断点 {item} 经过 {max_retry_attempts} 次重试后仍然失败")
|
||||
|
||||
# 重新获取当前页面项目,因为可能有新的项目加载
|
||||
continue
|
||||
# 向下滑动列表以加载更多项目
|
||||
if not self.scroll_list(direction="down"):
|
||||
self.logger.error("向下滑动列表失败")
|
||||
continue
|
||||
|
||||
if not self.check_apply_btn():
|
||||
self.logger.error(f"设备 {device_id} 检查平差处理按钮失败")
|
||||
self.execute_back_navigation_steps(device_id)
|
||||
continue
|
||||
# 检查是否到达底部:连续两次获取的项目相同
|
||||
if current_items == previous_items and len(current_items) > 0:
|
||||
self.logger.info("连续两次获取的项目相同,已到达列表底部")
|
||||
break
|
||||
|
||||
# 4. 点击平差处理按钮
|
||||
if not self.click_adjustment_button(device_id):
|
||||
self.logger.error(f"设备 {device_id} 点击平差处理按钮失败")
|
||||
continue
|
||||
# 更新前一次项目集合
|
||||
previous_items = current_items.copy()
|
||||
|
||||
# 检查是否在测量页面,在就重新执行选择断点,滑动列表到底部,点击最后一个spinner, 再下滑一次,点击平差处理按钮平差
|
||||
if not self.handle_back_navigation(breakpoint_name, device_id):
|
||||
self.logger.error(f"{breakpoint_name}平差失败,未截图")
|
||||
continue
|
||||
|
||||
|
||||
# 检测并处理"是 保留成果"弹窗
|
||||
if not self.handle_adjustment_result_dialog():
|
||||
self.logger.error("处理平差结果弹窗失败")
|
||||
continue
|
||||
|
||||
# # 平差完成,将断点数据保存到上传列表中
|
||||
# if not self.add_breakpoint_to_upload_list(breakpoint_name, line_code):
|
||||
# self.logger.error(f"设备 {device_id} 保存断点 {breakpoint_name} 到上传列表失败")
|
||||
# continue
|
||||
|
||||
# # 检查是否在测量页面,在就重新执行选择断点,滑动列表到底部,点击最后一个spinner, 再下滑一次,点击平差处理按钮平差
|
||||
# if not self.handle_back_navigation(breakpoint_name, device_id):
|
||||
# self.logger.error(f"{breakpoint_name}平差失败,未截图")
|
||||
# continue
|
||||
|
||||
# # 检测并处理"是 保留成果"弹窗
|
||||
# if not self.handle_adjustment_result_dialog():
|
||||
# self.logger.error("处理平差结果弹窗失败")
|
||||
# continue
|
||||
|
||||
|
||||
# 点击返回按钮并处理弹窗
|
||||
if not self.execute_back_navigation_steps(device_id):
|
||||
self.logger.error(f"设备 {device_id} 处理返回按钮确认失败")
|
||||
continue
|
||||
|
||||
# 成功处理完一个断点,添加到已处理列表
|
||||
processed_breakpoints.append(breakpoint_name)
|
||||
self.logger.info(f"成功处理断点: {breakpoint_name}")
|
||||
scroll_count += 1
|
||||
self.logger.info(f"第 {scroll_count} 次向下滑动,继续查找...")
|
||||
|
||||
# 检查是否所有断点都处理完成
|
||||
if len(processed_breakpoints) == len(breakpoint_names):
|
||||
self.logger.info(f"设备 {device_id} 平差页面操作执行完成")
|
||||
return True
|
||||
elif found_any:
|
||||
self.logger.warning(f"设备 {device_id} 部分断点处理完成,已成功处理 {len(processed_breakpoints)}/{len(breakpoint_names)} 个断点")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning(f"设备 {device_id} 部分断点处理失败,已成功处理 {len(processed_breakpoints)}/{len(breakpoint_names)} 个断点")
|
||||
self.logger.warning(f"设备 {device_id} 未找到任何目标断点")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
@@ -1450,22 +1419,3 @@ class ScreenshotPage:
|
||||
time.sleep(10)
|
||||
|
||||
return False
|
||||
def run_automation_test(self):
|
||||
# 滑动列表到底部
|
||||
if not self.scroll_list_to_bottom(self.device_id):
|
||||
self.logger.error(f"设备 {self.device_id} 下滑列表到底部失败")
|
||||
return False
|
||||
|
||||
# 2. 点击最后一个spinner
|
||||
if not self.click_last_spinner_with_retry(self.device_id):
|
||||
self.logger.error(f"设备 {self.device_id} 点击最后一个spinner失败")
|
||||
return False
|
||||
|
||||
# 3. 再下滑一次
|
||||
if not self.scroll_down_once(self.device_id):
|
||||
self.logger.warning(f"设备 {self.device_id} 再次下滑失败,但继续执行")
|
||||
|
||||
# 4. 点击平差处理按钮
|
||||
if not self.click_adjustment_button(self.device_id):
|
||||
self.logger.error(f"设备 {self.device_id} 点击平差处理按钮失败")
|
||||
return False
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# \page_objects\test_upload_config_page.py
|
||||
from appium.webdriver.common.appiumby import AppiumBy
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.common.exceptions import TimeoutException, NoSuchElementException
|
||||
import logging
|
||||
@@ -20,11 +21,74 @@ import globals.global_variable as global_variable
|
||||
class UploadConfigPage:
|
||||
def __init__(self, driver, wait, device_id):
|
||||
self.driver = driver
|
||||
self.wait = wait
|
||||
self.wait = WebDriverWait(driver, 2)
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self.more_download_page = MoreDownloadPage(driver, wait,device_id)
|
||||
self.device_id = device_id
|
||||
|
||||
|
||||
def get_breakpoint_list_from_page(self):
|
||||
"""
|
||||
从当前页面获取断点列表的断点名称
|
||||
Returns:
|
||||
list: 断点名称列表
|
||||
"""
|
||||
breakpoint_list = []
|
||||
try:
|
||||
# 优化点1: 等待列表容器出现,确保页面已加载
|
||||
self.wait.until(EC.presence_of_element_located((By.ID, "com.bjjw.cjgc:id/upload_result_list")))
|
||||
|
||||
# 优化点2: 等待至少一个itemContainer出现,确保列表有数据
|
||||
self.wait.until(EC.presence_of_element_located((By.ID, "com.bjjw.cjgc:id/itemContainer")))
|
||||
|
||||
# 方法1: 直接获取所有标题元素(最直接高效)
|
||||
title_elements = self.driver.find_elements(By.ID, "com.bjjw.cjgc:id/title")
|
||||
|
||||
if title_elements:
|
||||
for element in title_elements:
|
||||
breakpoint_name = element.text
|
||||
if breakpoint_name and breakpoint_name.strip(): # 增加空值过滤
|
||||
breakpoint_list.append(breakpoint_name.strip())
|
||||
print(f"✅ 直接通过title获取到 {len(breakpoint_list)} 个断点")
|
||||
|
||||
# 方法2: 如果方法1失败,通过itemContainer获取(备选方案)
|
||||
if not breakpoint_list:
|
||||
print("⚠️ 直接获取title失败,尝试通过itemContainer获取...")
|
||||
item_containers = self.driver.find_elements(By.ID, "com.bjjw.cjgc:id/itemContainer")
|
||||
for container in item_containers:
|
||||
try:
|
||||
title_element = container.find_element(By.ID, "com.bjjw.cjgc:id/title")
|
||||
breakpoint_name = title_element.text
|
||||
if breakpoint_name and breakpoint_name.strip():
|
||||
breakpoint_list.append(breakpoint_name.strip())
|
||||
except:
|
||||
continue
|
||||
print(f"✅ 通过itemContainer获取到 {len(breakpoint_list)} 个断点")
|
||||
|
||||
# 打印结果
|
||||
if breakpoint_list:
|
||||
print(f"📋 断点列表:")
|
||||
for i, name in enumerate(breakpoint_list, 1):
|
||||
print(f" {i}. {name}")
|
||||
else:
|
||||
print("⚠️ 未获取到任何断点,列表可能为空")
|
||||
|
||||
return breakpoint_list
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 获取断点列表失败: {str(e)}")
|
||||
# 可以在这里打印更多调试信息
|
||||
try:
|
||||
page_source = driver.page_source
|
||||
print("📄 当前页面源码已保存,可用于调试")
|
||||
# 可以将page_source保存到文件,方便分析
|
||||
with open("debug_page_source.xml", "w", encoding="utf-8") as f:
|
||||
f.write(page_source)
|
||||
except:
|
||||
pass
|
||||
return breakpoint_list
|
||||
|
||||
|
||||
def go_upload_config_page(self):
|
||||
"""点击img_2_layout(上传页面按钮)"""
|
||||
try:
|
||||
@@ -40,7 +104,7 @@ class UploadConfigPage:
|
||||
except Exception as e:
|
||||
self.logger.error(f"获取当前activity时出错: {str(e)}")
|
||||
|
||||
# 尝试返回到主页面(如果不在主页面)
|
||||
# 尝试返回到主页面(如果不在主页面)保存上传
|
||||
self.logger.info("尝试返回到主页面...")
|
||||
max_back_presses = 5 # 最多按返回键次数
|
||||
back_press_count = 0
|
||||
@@ -139,6 +203,45 @@ class UploadConfigPage:
|
||||
EC.presence_of_element_located((AppiumBy.XPATH, item_container_xpath))
|
||||
)
|
||||
# self.logger.info(f"找到包含断点 {breakpoint_name} 的itemContainer")
|
||||
# 1. 获取测量时间并比较是不是今天
|
||||
# 在itemContainer内查找subtitle元素
|
||||
try:
|
||||
subtitle_element = item_container.find_element(
|
||||
AppiumBy.ID,
|
||||
"com.bjjw.cjgc:id/subtitle"
|
||||
)
|
||||
measurement_time_text = subtitle_element.text
|
||||
self.logger.info(f"找到测量时间文本: {measurement_time_text}")
|
||||
|
||||
# 提取时间部分(去掉"测量时间:"前缀)
|
||||
if "测量时间:" in measurement_time_text:
|
||||
# 方法1:使用split提取年月日部分
|
||||
time_str = measurement_time_text.replace("测量时间:", "")
|
||||
# 只取年月日部分(假设格式为 YYYY-MM-DD HH:MM:SS)
|
||||
measurement_date_str = time_str.split()[0] # 取空格前的部分
|
||||
self.logger.info(f"提取到的测量日期: {measurement_date_str}")
|
||||
|
||||
try:
|
||||
# 将字符串日期转换为datetime对象进行比较
|
||||
measurement_date = datetime.strptime(measurement_date_str, "%Y-%m-%d").date()
|
||||
today_date = datetime.now().date()
|
||||
|
||||
self.logger.info(f"测量日期: {measurement_date}, 今天日期: {today_date}")
|
||||
|
||||
# 判断逻辑:测量日期 > 今天 → 不允许上传
|
||||
if measurement_date > today_date:
|
||||
self.logger.warning(f"测量日期 {measurement_date} 是未来日期,不允许上传")
|
||||
return False
|
||||
|
||||
# 测量日期 <= 今天 → 允许上传
|
||||
self.logger.info(f"✓ 测量日期 {measurement_date} 小于等于今天,允许上传")
|
||||
|
||||
except ValueError as e:
|
||||
self.logger.error(f"日期格式解析失败: {measurement_date_str}, 错误: {str(e)}")
|
||||
return False
|
||||
except Exception as e:
|
||||
self.logger.warning(f"获取测量时间失败: {str(e)};不点击线路{breakpoint_name}的上传按钮")
|
||||
return False
|
||||
|
||||
# 在itemContainer中查找上传按钮
|
||||
upload_btn = item_container.find_element(
|
||||
@@ -151,17 +254,7 @@ class UploadConfigPage:
|
||||
self.logger.info(f"已点击断点 {breakpoint_name} 的上传按钮")
|
||||
|
||||
# 等待上传操作开始
|
||||
time.sleep(3)
|
||||
|
||||
# # 检查上传是否开始
|
||||
# try:
|
||||
# upload_indicator = WebDriverWait(self.driver, 20).until(
|
||||
# EC.presence_of_element_located((AppiumBy.XPATH, "//*[contains(@text, '上传') or contains(@text, 'Upload')]"))
|
||||
# )
|
||||
# self.logger.info(f"上传操作已开始: {upload_indicator.text}")
|
||||
# except TimeoutException:
|
||||
# self.logger.warning("未检测到明确的上传开始提示,但按钮点击已完成")
|
||||
|
||||
# time.sleep(3)
|
||||
return True
|
||||
|
||||
except TimeoutException:
|
||||
@@ -314,8 +407,8 @@ class UploadConfigPage:
|
||||
'com.bjjw.cjgc:id/point_values'
|
||||
)
|
||||
|
||||
self.logger.info(f"找到 {len(point_name_elements)} 个测点")
|
||||
self.logger.info(f"找到 {len(point_value_elements)} 个数据元素")
|
||||
# self.logger.info(f"找到 {len(point_name_elements)} 个测点")
|
||||
# self.logger.info(f"找到 {len(point_value_elements)} 个数据元素")
|
||||
|
||||
# 提取每个测点的数据
|
||||
for i, (name_element, value_element) in enumerate(zip(point_name_elements, point_value_elements)):
|
||||
@@ -354,7 +447,7 @@ class UploadConfigPage:
|
||||
|
||||
point_data.append(point_info)
|
||||
|
||||
self.logger.info(f"测点 {i+1}: {point_name}")
|
||||
# self.logger.info(f"测点 {i+1}: {point_name}")
|
||||
# self.logger.info(f"完整数据: {point_value}")
|
||||
|
||||
except Exception as e:
|
||||
@@ -458,54 +551,54 @@ class UploadConfigPage:
|
||||
self.logger.error(f"检查上传配置页面时发生意外错误: {str(e)}")
|
||||
return False
|
||||
|
||||
def collect_all_point_data(self, results_dir):
|
||||
"""循环滑动收集所有测点数据,直到没有新数据出现"""
|
||||
all_point_data = []
|
||||
seen_point_names = set() # 用于跟踪已经见过的测点名称
|
||||
max_scroll_attempts = 20 # 最大滑动次数,防止无限循环
|
||||
scroll_attempt = 0
|
||||
# def collect_all_point_data(self, results_dir):
|
||||
# """循环滑动收集所有测点数据,直到没有新数据出现"""
|
||||
# all_point_data = []
|
||||
# seen_point_names = set() # 用于跟踪已经见过的测点名称
|
||||
# max_scroll_attempts = 20 # 最大滑动次数,防止无限循环
|
||||
# scroll_attempt = 0
|
||||
|
||||
self.logger.info("开始循环滑动收集所有测点数据...")
|
||||
# self.logger.info("开始循环滑动收集所有测点数据...")
|
||||
|
||||
while scroll_attempt < max_scroll_attempts:
|
||||
scroll_attempt += 1
|
||||
self.logger.info(f"第 {scroll_attempt} 次尝试获取数据...")
|
||||
# while scroll_attempt < max_scroll_attempts:
|
||||
# scroll_attempt += 1
|
||||
# self.logger.info(f"第 {scroll_attempt} 次尝试获取数据...")
|
||||
|
||||
# 获取当前屏幕的测点数据
|
||||
current_point_data = self.get_point_data()
|
||||
# # 获取当前屏幕的测点数据
|
||||
# current_point_data = self.get_point_data()
|
||||
|
||||
if not current_point_data:
|
||||
self.logger.info("当前屏幕没有测点数据,停止滑动")
|
||||
break
|
||||
# if not current_point_data:
|
||||
# self.logger.info("当前屏幕没有测点数据,停止滑动")
|
||||
# break
|
||||
|
||||
# 统计新发现的测点
|
||||
new_points_count = 0
|
||||
for point in current_point_data:
|
||||
point_name = point.get('point_name')
|
||||
if point_name and point_name not in seen_point_names:
|
||||
# 新测点,添加到结果集
|
||||
all_point_data.append(point)
|
||||
seen_point_names.add(point_name)
|
||||
new_points_count += 1
|
||||
# # 统计新发现的测点
|
||||
# new_points_count = 0
|
||||
# for point in current_point_data:
|
||||
# point_name = point.get('point_name')
|
||||
# if point_name and point_name not in seen_point_names:
|
||||
# # 新测点,添加到结果集
|
||||
# all_point_data.append(point)
|
||||
# seen_point_names.add(point_name)
|
||||
# new_points_count += 1
|
||||
|
||||
self.logger.info(f"本次获取到 {len(current_point_data)} 个测点,其中 {new_points_count} 个是新测点")
|
||||
# self.logger.info(f"本次获取到 {len(current_point_data)} 个测点,其中 {new_points_count} 个是新测点")
|
||||
|
||||
# 如果没有新数据,停止滑动
|
||||
if new_points_count == 0:
|
||||
self.logger.info("没有发现新测点,停止滑动")
|
||||
break
|
||||
# # 如果没有新数据,停止滑动
|
||||
# if new_points_count == 0:
|
||||
# self.logger.info("没有发现新测点,停止滑动")
|
||||
# break
|
||||
|
||||
# 滑动到下一页
|
||||
self.logger.info("滑动到下一页...")
|
||||
if not self.swipe_up():
|
||||
self.logger.warning("滑动失败,停止收集")
|
||||
break
|
||||
# # 滑动到下一页
|
||||
# self.logger.info("滑动到下一页...")
|
||||
# if not self.swipe_up():
|
||||
# self.logger.warning("滑动失败,停止收集")
|
||||
# break
|
||||
|
||||
# 等待页面稳定
|
||||
time.sleep(1)
|
||||
# # 等待页面稳定
|
||||
# time.sleep(1)
|
||||
|
||||
self.logger.info(f"数据收集完成,共获取 {len(all_point_data)} 个测点数据")
|
||||
return all_point_data
|
||||
# self.logger.info(f"数据收集完成,共获取 {len(all_point_data)} 个测点数据")
|
||||
# return all_point_data
|
||||
|
||||
def collect_check_all_point_data(self, max_variation):
|
||||
"""循环滑动收集所有测点数据,直到没有新数据出现"""
|
||||
@@ -518,7 +611,7 @@ class UploadConfigPage:
|
||||
|
||||
while scroll_attempt < max_scroll_attempts:
|
||||
scroll_attempt += 1
|
||||
self.logger.info(f"第 {scroll_attempt} 次尝试获取数据...")
|
||||
# self.logger.info(f"第 {scroll_attempt} 次尝试获取数据...")
|
||||
|
||||
# 获取当前屏幕的测点数据
|
||||
current_point_data = self.get_point_data()
|
||||
@@ -633,10 +726,13 @@ class UploadConfigPage:
|
||||
def _load_user_data(self):
|
||||
"""加载用户数据从Excel文件,只提取名字和身份证到字典"""
|
||||
try:
|
||||
# 默认路径:当前脚本的上一级目录下的"上传人员信息.xlsx"
|
||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
parent_dir = os.path.dirname(current_dir)
|
||||
excel_path = os.path.join(parent_dir, "上传人员信息.xlsx")
|
||||
# # 默认路径:当前脚本的上一级目录下的"上传人员信息.xlsx"
|
||||
# current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
# parent_dir = os.path.dirname(current_dir)
|
||||
# excel_path = os.path.join(parent_dir, "上传人员信息.xlsx")
|
||||
|
||||
# 固定路径:D:\uploadInfo\上传人员信息.xlsx
|
||||
excel_path = os.path.join("D:\\", "uploadInfo", "上传人员信息.xlsx")
|
||||
|
||||
if not os.path.exists(excel_path):
|
||||
logging.error(f"Excel文件不存在: {excel_path}")
|
||||
@@ -671,7 +767,7 @@ class UploadConfigPage:
|
||||
logging.warning(f"跳过无效数据: 姓名='{name}', 身份证='{id_card}'")
|
||||
|
||||
# 将字典保存到全局变量
|
||||
global_variable.GLOBAL_NAME_TO_ID_MAP = name_id_map
|
||||
global_variable.set_name_to_id_map(name_id_map)
|
||||
|
||||
logging.info(f"成功加载用户数据,共 {len(df)} 条记录,{len(name_id_map)} 个有效姓名-身份证映射")
|
||||
|
||||
@@ -711,7 +807,7 @@ class UploadConfigPage:
|
||||
logging.info(f"使用第一个数据员: {sjname}")
|
||||
|
||||
# 获取身份证号码
|
||||
id_card = global_variable.GLOBAL_NAME_TO_ID_MAP.get(sjname)
|
||||
id_card = global_variable.get_name_to_id_map().get(sjname)
|
||||
logging.info(f"id_card: {id_card}")
|
||||
if not id_card:
|
||||
logging.error(f"未找到数据员 {sjname} 对应的身份证号")
|
||||
@@ -919,7 +1015,7 @@ class UploadConfigPage:
|
||||
|
||||
if workinfo_names:
|
||||
workinfo_name = workinfo_names[0] # 主要工况
|
||||
self.logger.info(f"为{work_type_name}({work_type_str})选择主要工况: {workinfo_name}")
|
||||
# self.logger.info(f"为{work_type_name}({work_type_str})选择主要工况: {workinfo_name}")
|
||||
|
||||
try:
|
||||
# 点击工况选择按钮
|
||||
@@ -928,18 +1024,56 @@ class UploadConfigPage:
|
||||
)
|
||||
condition_button.click()
|
||||
self.logger.info(f"成功点击{work_type_name}工况选择按钮")
|
||||
|
||||
# 选择主要的工况选项
|
||||
if self._select_condition_option(workinfo_name):
|
||||
self.logger.info(f"成功为{work_type_name}选择主要工况: {workinfo_name}")
|
||||
success_count += 1
|
||||
else:
|
||||
self.logger.warning(f"未能为{work_type_name}选择主要工况: {workinfo_name}")
|
||||
|
||||
except TimeoutException:
|
||||
self.logger.error(f"等待{work_type_name}工况选择按钮超时")
|
||||
id_list = [
|
||||
"com.bjjw.cjgc:id/all_point_workinfo_sp_suidao",
|
||||
"com.bjjw.cjgc:id/all_point_workinfo_sp_luji",
|
||||
"com.bjjw.cjgc:id/all_point_workinfo_sp_qiaoliang",
|
||||
"com.bjjw.cjgc:id/all_point_workinfo_sp_handong",
|
||||
]
|
||||
for id in id_list:
|
||||
if id == button_id:
|
||||
continue
|
||||
try:
|
||||
self.wait.until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, id))
|
||||
)
|
||||
self.driver.find_element(AppiumBy.ID, id).click()
|
||||
self.logger.info(f"成功点击{work_type_name}其他工况选择按钮: {id}")
|
||||
except TimeoutException:
|
||||
self.logger.error(f"等待{work_type_name}其他工况选择按钮超时: {id}")
|
||||
# return False
|
||||
except Exception as e:
|
||||
self.logger.error(f"点击{work_type_name}工况按钮时出错: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
|
||||
# 检查是否有ListView,如果没有就再次点击
|
||||
try:
|
||||
# 尝试查找ListView
|
||||
self.wait.until(
|
||||
EC.presence_of_element_located((AppiumBy.CLASS_NAME, "android.widget.ListView"))
|
||||
)
|
||||
self.logger.info(f"找到{work_type_name}工况选择的ListView")
|
||||
except TimeoutException:
|
||||
# 没有找到ListView,再次点击按钮
|
||||
self.logger.warning(f"未找到{work_type_name}工况选择的ListView,再次点击按钮")
|
||||
condition_button.click()
|
||||
self.logger.info(f"再次成功点击{work_type_name}工况选择按钮")
|
||||
|
||||
# 选择主要的工况选项
|
||||
if self._select_condition_option(workinfo_name):
|
||||
self.logger.info(f"成功为{work_type_name}选择主要工况: {workinfo_name}")
|
||||
success_count += 1
|
||||
else:
|
||||
self.logger.warning(f"未能为{work_type_name}选择主要工况: {workinfo_name}")
|
||||
|
||||
# except TimeoutException:
|
||||
# self.logger.error(f"等待{work_type_name}工况选择按钮超时")
|
||||
# except Exception as e:
|
||||
# self.logger.error(f"点击{work_type_name}工况按钮时出错: {str(e)}")
|
||||
|
||||
# 第二步:如果有次要工况,滑动页面处理
|
||||
if minor_conditions_list:
|
||||
@@ -1117,10 +1251,24 @@ class UploadConfigPage:
|
||||
"com.bjjw.cjgc:id/point_workinfo_sp"
|
||||
)
|
||||
|
||||
|
||||
# 验证按钮是否可见和可用
|
||||
if workinfo_button.is_displayed() and workinfo_button.is_enabled():
|
||||
workinfo_button.click()
|
||||
self.logger.info(f"已点击测点 {point_id} 的工况选择按钮")
|
||||
self.logger.info(f"已点击测点 {point_id} 的次要工况选择按钮")
|
||||
# 检查是否有ListView,如果没有就再次点击
|
||||
try:
|
||||
# 尝试查找ListView
|
||||
self.wait.until(
|
||||
EC.presence_of_element_located((AppiumBy.CLASS_NAME, "android.widget.ListView"))
|
||||
)
|
||||
self.logger.info(f"找到{point_id}次要工况选择的ListView")
|
||||
except TimeoutException:
|
||||
# 没有找到ListView,再次点击按钮
|
||||
self.logger.warning(f"未找到{point_id}次要工况选择的ListView,再次点击按钮")
|
||||
workinfo_button.click()
|
||||
self.logger.info(f"再次成功点击{point_id}次要工况选择按钮")
|
||||
|
||||
|
||||
# 选择对应的工况选项
|
||||
if self._select_minor_conditions_option(workinfoname, work_type):
|
||||
@@ -1367,33 +1515,6 @@ class UploadConfigPage:
|
||||
|
||||
return points
|
||||
|
||||
def _set_single_point_work_condition(self, point_data: Dict, workinfo_name: str, work_type: str) -> bool:
|
||||
"""为单个测点设置工况信息"""
|
||||
try:
|
||||
point_name = point_data.get('point_name')
|
||||
self.logger.info(f"开始为测点 {point_name} 设置工况: {workinfo_name}")
|
||||
|
||||
# 使用保存的元素引用点击工况选择按钮
|
||||
workinfo_element = point_data.get('workinfo_element')
|
||||
if workinfo_element:
|
||||
workinfo_element.click()
|
||||
time.sleep(1) # 等待选项弹出
|
||||
|
||||
# 选择指定的工况
|
||||
if self._select_condition_option(workinfo_name):
|
||||
self.logger.info(f"成功为测点 {point_name} 设置工况: {workinfo_name}")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning(f"为测点 {point_name} 选择工况选项失败")
|
||||
return False
|
||||
else:
|
||||
self.logger.warning(f"未找到测点 {point_name} 的工况选择按钮")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"为测点 {point_name} 设置工况时出错: {str(e)}")
|
||||
return False
|
||||
|
||||
def _select_condition_option(self, condition_name: str) -> bool:
|
||||
"""选择具体的工况选项
|
||||
|
||||
@@ -1413,7 +1534,7 @@ class UploadConfigPage:
|
||||
EC.element_to_be_clickable((AppiumBy.XPATH, option_xpath))
|
||||
)
|
||||
option_element.click()
|
||||
self.logger.info(f"通过文本定位成功选择工况: {condition_name}")
|
||||
# self.logger.info(f"通过文本定位成功选择工况: {condition_name}")
|
||||
return True
|
||||
except TimeoutException:
|
||||
self.logger.debug(f"通过文本'{condition_name}'未找到工况选项")
|
||||
@@ -1431,18 +1552,18 @@ class UploadConfigPage:
|
||||
self.logger.debug("未找到列表项形式的工况选项")
|
||||
|
||||
# 方法3: 尝试点击屏幕特定位置(备选方案)
|
||||
try:
|
||||
# 获取屏幕尺寸
|
||||
window_size = self.driver.get_window_size()
|
||||
x = window_size['width'] // 2
|
||||
y = window_size['height'] // 2
|
||||
# try:
|
||||
# # 获取屏幕尺寸
|
||||
# window_size = self.driver.get_window_size()
|
||||
# x = window_size['width'] // 2
|
||||
# y = window_size['height'] // 2
|
||||
|
||||
# 点击屏幕中央(假设选项在中间)
|
||||
self.driver.tap([(x, y)])
|
||||
self.logger.info("通过点击屏幕中央选择工况")
|
||||
return True
|
||||
except Exception as e:
|
||||
self.logger.debug(f"点击屏幕中央失败: {str(e)}")
|
||||
# # 点击屏幕中央(假设选项在中间)
|
||||
# self.driver.tap([(x, y)])
|
||||
# self.logger.info("通过点击屏幕中央选择工况")
|
||||
# return True
|
||||
# except Exception as e:
|
||||
# self.logger.debug(f"点击屏幕中央失败: {str(e)}")
|
||||
|
||||
self.logger.error(f"所有方法都无法选择工况选项: {condition_name}")
|
||||
return False
|
||||
@@ -1480,12 +1601,12 @@ class UploadConfigPage:
|
||||
# return False
|
||||
# 跳转到上传配置页面
|
||||
if not go_main_click_tabber_button(self.driver, self.device_id, "com.bjjw.cjgc:id/img_2_layout"):
|
||||
logging.error(f"设备 {self.device_id} 跳转到上传配置页面失败")
|
||||
logging.error(f"设备 {self.device_id} 跳转到上传配置页面失败(下载操作)")
|
||||
return False
|
||||
|
||||
# 根据断点名称点击上传按钮
|
||||
if not self.click_upload_by_breakpoint_name(breakpoint_name):
|
||||
self.logger.error("点击上传按钮失败")
|
||||
self.logger.error("点击上传按钮失败(下载操作)")
|
||||
return False
|
||||
|
||||
if not self.handle_upload_dialog():
|
||||
@@ -1498,6 +1619,7 @@ class UploadConfigPage:
|
||||
if not self.is_on_upload_config_page():
|
||||
self.logger.info("不在上传配置页面,尝试导航...")
|
||||
return False
|
||||
print(f"进入: {breakpoint_name}的上传配置页面")
|
||||
|
||||
# 检查是否有变化量属性
|
||||
if not self.check_change_amount_on_page():
|
||||
@@ -1534,16 +1656,24 @@ class UploadConfigPage:
|
||||
save_upload_btn = WebDriverWait(self.driver, 10).until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/improve_save_btn"))
|
||||
)
|
||||
save_upload_btn.click()
|
||||
self.logger.info("已点击保存上传按钮")
|
||||
|
||||
# 处理警告弹窗
|
||||
time.sleep(1)
|
||||
if not self.handle_warning_dialog():
|
||||
self.logger.error("处理警告弹窗失败")
|
||||
return False
|
||||
max_retries = 3
|
||||
for attempt in range(max_retries):
|
||||
save_upload_btn.click()
|
||||
self.logger.info(f"已点击保存上传按钮 (第 {attempt + 1} 次)")
|
||||
|
||||
return True
|
||||
# 处理警告弹窗
|
||||
time.sleep(1)
|
||||
if self.handle_warning_dialog():
|
||||
self.logger.info("处理警告弹窗成功")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning(f"处理警告弹窗失败,准备重试 ({attempt + 1}/{max_retries})")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(1)
|
||||
|
||||
self.logger.error(f"处理警告弹窗失败,已达到最大重试次数 {max_retries}")
|
||||
return False
|
||||
|
||||
except TimeoutException:
|
||||
self.logger.error("点击保存上传按钮超时")
|
||||
@@ -1594,7 +1724,7 @@ class UploadConfigPage:
|
||||
self.logger.info("开始等待上传完成")
|
||||
|
||||
# 等待弹窗显示
|
||||
upload_list = WebDriverWait(self.driver, 10).until(
|
||||
upload_list = WebDriverWait(self.driver, 2).until(
|
||||
EC.presence_of_element_located((AppiumBy.ID, "android:id/customPanel"))
|
||||
)
|
||||
#等待弹窗消失
|
||||
@@ -1654,7 +1784,7 @@ class UploadConfigPage:
|
||||
minor_conditions_list = [] # 次要工况列表 [{point_id, work_type, workinfoname}]
|
||||
|
||||
# 定义阈值:出现次数少于这个值的认为是次要工况
|
||||
minor_threshold = 3 # 可以根据实际情况调整
|
||||
minor_threshold = 2 # 可以根据实际情况调整
|
||||
|
||||
for work_type, workinfoname_counts in work_type_stats.items():
|
||||
if workinfoname_counts:
|
||||
@@ -1724,7 +1854,7 @@ class UploadConfigPage:
|
||||
|
||||
# 跳转到上传配置页面
|
||||
if not go_main_click_tabber_button(self.driver, self.device_id, "com.bjjw.cjgc:id/img_2_layout"):
|
||||
logging.error(f"设备 {self.device_id} 跳转到测量页面失败")
|
||||
logging.error(f"设备 {self.device_id} 跳转到上传配置页面失败")
|
||||
return False
|
||||
|
||||
# 根据断点名称点击上传按钮
|
||||
@@ -1759,7 +1889,7 @@ class UploadConfigPage:
|
||||
else:
|
||||
self.logger.info("页面中包含变化量属性,继续执行后续操作")
|
||||
|
||||
user_id = global_variable.GLOBAL_USERNAME
|
||||
user_id = global_variable.get_username()
|
||||
if user_id is None:
|
||||
self.logger.error("获取用户ID失败")
|
||||
return False
|
||||
@@ -1805,21 +1935,17 @@ class UploadConfigPage:
|
||||
|
||||
# 获取线路的所有工况信息
|
||||
work_conditions = apis.get_work_conditions_by_linecode(self.line_num)
|
||||
# work_conditions = {'1962527': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 2},
|
||||
# '0299815Z2': {'sjName': '王顺', 'workinfoname': '冬休', 'work_type': 2},
|
||||
# '0299820H1': {'sjName': '王顺', 'workinfoname': '架桥机(运梁车) 首次通过后', 'work_type': 4},
|
||||
# '0431248D1': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 4},
|
||||
# '0431248D2': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 4},
|
||||
# '0299815Z1': {'sjName': '王顺', 'workinfoname': '架桥机(运梁车) 首次通过前', 'work_type': 2},
|
||||
# '0431289D2': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 4},
|
||||
# '0431330D1': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 2},
|
||||
# '0431330D2': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 2},
|
||||
# '0431370D1': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 2}}
|
||||
self.logger.info(f"获取线路工况信息成功: {work_conditions}")
|
||||
# self.logger.info(f"获取线路工况信息成功: {work_conditions}")
|
||||
if not work_conditions:
|
||||
self.logger.error("获取工况信息失败")
|
||||
return False
|
||||
|
||||
# 遍历返回数据的所有workinfoname,如果为空就打印当前在上传的线路名称
|
||||
for workinfo in work_conditions.values():
|
||||
if not workinfo.get('workinfoname'):
|
||||
print(f"❌❌❌❌❌线路编码 '{self.line_num}' 中有工况缺失(请复制发送编码给相关人员)❌❌❌❌❌")
|
||||
return False
|
||||
|
||||
# 提取人员姓名和身份证
|
||||
if not self._load_user_data():
|
||||
self.logger.error("加载用户数据失败")
|
||||
@@ -1844,13 +1970,15 @@ class UploadConfigPage:
|
||||
return False
|
||||
|
||||
|
||||
# # 表达填写完成,点击"保存上传"并处理弹窗
|
||||
# if not self.click_save_upload_and_handle_dialogs():
|
||||
# self.logger.error("点击保存上传并处理弹窗失败")
|
||||
# return False
|
||||
# 表达填写完成,点击"保存上传"并处理弹窗
|
||||
if not self.click_save_upload_and_handle_dialogs():
|
||||
self.logger.error("点击保存上传并处理弹窗失败")
|
||||
return False
|
||||
|
||||
# # 暂不上传,使用返回按钮替代。
|
||||
# self.driver.back()
|
||||
# return True
|
||||
|
||||
# 暂不上传,使用返回按钮替代。
|
||||
self.driver.back()
|
||||
|
||||
# 等待上传,查看loading弹窗。没有就下一个
|
||||
if not self.wait_for_upload_completion():
|
||||
@@ -1859,7 +1987,7 @@ class UploadConfigPage:
|
||||
|
||||
self.logger.info("上传配置页面操作执行完成")
|
||||
# 把上传成功的断点写入全局变量GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST
|
||||
global_variable.GLOBAL_UPLOAD_SUCCESS_BREAKPOINT_LIST.append(breakpoint_name)
|
||||
global_variable.get_upload_success_breakpoint_list().append(breakpoint_name)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
196
permissions.py
196
permissions.py
@@ -2,6 +2,7 @@
|
||||
import subprocess
|
||||
import logging
|
||||
import time
|
||||
import os
|
||||
|
||||
# 配置日志
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s: %(message)s")
|
||||
@@ -83,90 +84,143 @@ def grant_single_permission(device_id: str, package: str, permission: str) -> bo
|
||||
logging.error(f"设备 {device_id}:处理 {package} 时发生未知错误:{str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
# def grant_appium_permissions(device_id: str, require_all: bool = False) -> bool:
|
||||
# """
|
||||
# 为 Appium UiAutomator2 服务授予权限
|
||||
# :param device_id: 设备 ID
|
||||
# :param require_all: 是否要求所有权限都成功授予
|
||||
# :return: 权限授予是否成功(根据require_all参数判断)
|
||||
# """
|
||||
# # 首先检查设备连接
|
||||
# if not check_device_connection(device_id):
|
||||
# return False
|
||||
|
||||
# packages_to_grant = [
|
||||
# "io.appium.settings",
|
||||
# "io.appium.uiautomator2.server",
|
||||
# "io.appium.uiautomator2.server.test"
|
||||
# ]
|
||||
|
||||
# # 权限列表(按优先级排序)
|
||||
# permissions_to_grant = [
|
||||
# "android.permission.SET_ANIMATION_SCALE",
|
||||
# "android.permission.CHANGE_CONFIGURATION",
|
||||
# "android.permission.WRITE_SETTINGS",
|
||||
# "android.permission.DISABLE_KEYGUARD",
|
||||
# ]
|
||||
|
||||
# success_count = 0
|
||||
# total_attempted = 0
|
||||
# package_results = {}
|
||||
|
||||
# # 检查并授予权限
|
||||
# for package in packages_to_grant:
|
||||
# package_results[package] = {"installed": False, "permissions": {}}
|
||||
|
||||
# if not is_package_installed(device_id, package):
|
||||
# logging.warning(f"设备 {device_id}:包 {package} 未安装,跳过权限授予")
|
||||
# package_results[package]["installed"] = False
|
||||
# continue
|
||||
|
||||
# package_results[package]["installed"] = True
|
||||
# package_success = 0
|
||||
# package_attempted = 0
|
||||
|
||||
# for permission in permissions_to_grant:
|
||||
# total_attempted += 1
|
||||
# package_attempted += 1
|
||||
|
||||
# result = grant_single_permission(device_id, package, permission)
|
||||
# package_results[package]["permissions"][permission] = result
|
||||
|
||||
# if result:
|
||||
# success_count += 1
|
||||
# package_success += 1
|
||||
|
||||
# # 记录每个包的授权结果
|
||||
# logging.info(f"设备 {device_id}:包 {package} 权限授予结果: {package_success}/{package_attempted}")
|
||||
|
||||
# # 统计和报告
|
||||
# logging.info(f"设备 {device_id}:权限授予完成")
|
||||
# logging.info(f"总计: 尝试 {total_attempted} 次,成功 {success_count} 次")
|
||||
|
||||
# # 检查每个包的关键权限
|
||||
# critical_permission = "android.permission.WRITE_SECURE_SETTINGS"
|
||||
# critical_failures = []
|
||||
|
||||
# for package, info in package_results.items():
|
||||
# if info["installed"] and critical_permission in info["permissions"]:
|
||||
# if not info["permissions"][critical_permission]:
|
||||
# critical_failures.append(package)
|
||||
|
||||
# if critical_failures:
|
||||
# logging.warning(f"设备 {device_id}:以下包的关键权限 {critical_permission} 授予失败: {', '.join(critical_failures)}")
|
||||
# logging.warning("这可能会影响某些自动化功能,但基础测试通常不受影响")
|
||||
|
||||
# # 根据require_all参数返回结果
|
||||
# if require_all:
|
||||
# # 要求所有权限都成功
|
||||
# if critical_failures:
|
||||
# logging.error("关键权限授予失败,无法继续(require_all=True)")
|
||||
# return False
|
||||
# return success_count == total_attempted
|
||||
# else:
|
||||
# # 不要求所有权限,只要设备连接正常就返回True
|
||||
# logging.info(f"设备 {device_id}:权限授予过程完成,建议重启设备或Appium服务使更改生效")
|
||||
# return True
|
||||
|
||||
def grant_appium_permissions(device_id: str, require_all: bool = False) -> bool:
|
||||
"""
|
||||
为 Appium UiAutomator2 服务授予权限
|
||||
:param device_id: 设备 ID
|
||||
:param require_all: 是否要求所有权限都成功授予
|
||||
:return: 权限授予是否成功(根据require_all参数判断)
|
||||
修复版:为 Appium 授予权限(使用正确的方法)
|
||||
"""
|
||||
# 首先检查设备连接
|
||||
if not check_device_connection(device_id):
|
||||
return False
|
||||
logging.info(f"设备 {device_id}:开始设置Appium权限")
|
||||
|
||||
packages_to_grant = [
|
||||
"io.appium.settings",
|
||||
"io.appium.uiautomator2.server",
|
||||
"io.appium.uiautomator2.server.test"
|
||||
]
|
||||
|
||||
# 权限列表(按优先级排序)
|
||||
permissions_to_grant = [
|
||||
"android.permission.WRITE_SECURE_SETTINGS",
|
||||
"android.permission.CHANGE_CONFIGURATION",
|
||||
"android.permission.DUMP",
|
||||
# 1. 使用系统设置命令(替代原来的pm grant尝试)
|
||||
logging.info("使用系统设置命令...")
|
||||
system_commands = [
|
||||
["adb", "-s", device_id, "shell", "settings", "put", "global", "window_animation_scale", "0"],
|
||||
["adb", "-s", device_id, "shell", "settings", "put", "global", "transition_animation_scale", "0"],
|
||||
["adb", "-s", device_id, "shell", "settings", "put", "global", "animator_duration_scale", "0"],
|
||||
["adb", "-s", device_id, "shell", "settings", "put", "system", "screen_off_timeout", "86400000"],
|
||||
]
|
||||
|
||||
success_count = 0
|
||||
total_attempted = 0
|
||||
package_results = {}
|
||||
|
||||
# 检查并授予权限
|
||||
for package in packages_to_grant:
|
||||
package_results[package] = {"installed": False, "permissions": {}}
|
||||
|
||||
if not is_package_installed(device_id, package):
|
||||
logging.warning(f"设备 {device_id}:包 {package} 未安装,跳过权限授予")
|
||||
package_results[package]["installed"] = False
|
||||
continue
|
||||
|
||||
package_results[package]["installed"] = True
|
||||
package_success = 0
|
||||
package_attempted = 0
|
||||
|
||||
for permission in permissions_to_grant:
|
||||
total_attempted += 1
|
||||
package_attempted += 1
|
||||
|
||||
result = grant_single_permission(device_id, package, permission)
|
||||
package_results[package]["permissions"][permission] = result
|
||||
|
||||
if result:
|
||||
for cmd in system_commands:
|
||||
try:
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, timeout=10)
|
||||
if result.returncode == 0:
|
||||
success_count += 1
|
||||
package_success += 1
|
||||
logging.info(f" 成功: {' '.join(cmd[3:])}")
|
||||
else:
|
||||
logging.warning(f" 失败: {' '.join(cmd[3:])}")
|
||||
except:
|
||||
logging.warning(f" 异常: {' '.join(cmd[3:])}")
|
||||
|
||||
# 记录每个包的授权结果
|
||||
logging.info(f"设备 {device_id}:包 {package} 权限授予结果: {package_success}/{package_attempted}")
|
||||
# 2. 授予可自动授予的权限
|
||||
logging.info("授予基础权限...")
|
||||
grantable = [
|
||||
"android.permission.INTERNET",
|
||||
"android.permission.ACCESS_NETWORK_STATE",
|
||||
"android.permission.ACCESS_WIFI_STATE",
|
||||
]
|
||||
|
||||
# 统计和报告
|
||||
logging.info(f"设备 {device_id}:权限授予完成")
|
||||
logging.info(f"总计: 尝试 {total_attempted} 次,成功 {success_count} 次")
|
||||
for perm in grantable:
|
||||
cmd = ["adb", "-s", device_id, "shell", "pm", "grant", "io.appium.settings", perm]
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, timeout=10)
|
||||
if result.returncode == 0:
|
||||
success_count += 1
|
||||
logging.info(f" 成功授予: {perm.split('.')[-1]}")
|
||||
else:
|
||||
logging.debug(f" 跳过: {perm.split('.')[-1]}")
|
||||
|
||||
# 检查每个包的关键权限
|
||||
critical_permission = "android.permission.WRITE_SECURE_SETTINGS"
|
||||
critical_failures = []
|
||||
# 3. 返回结果
|
||||
logging.info(f"设置完成,成功项数: {success_count}")
|
||||
|
||||
for package, info in package_results.items():
|
||||
if info["installed"] and critical_permission in info["permissions"]:
|
||||
if not info["permissions"][critical_permission]:
|
||||
critical_failures.append(package)
|
||||
|
||||
if critical_failures:
|
||||
logging.warning(f"设备 {device_id}:以下包的关键权限 {critical_permission} 授予失败: {', '.join(critical_failures)}")
|
||||
logging.warning("这可能会影响某些自动化功能,但基础测试通常不受影响")
|
||||
|
||||
# 根据require_all参数返回结果
|
||||
if require_all:
|
||||
# 要求所有权限都成功
|
||||
if critical_failures:
|
||||
logging.error("关键权限授予失败,无法继续(require_all=True)")
|
||||
return False
|
||||
return success_count == total_attempted
|
||||
return success_count == (len(system_commands) + len(grantable))
|
||||
else:
|
||||
# 不要求所有权限,只要设备连接正常就返回True
|
||||
logging.info(f"设备 {device_id}:权限授予过程完成,建议重启设备或Appium服务使更改生效")
|
||||
return True
|
||||
|
||||
return success_count > 0 # 只要有成功项就返回True
|
||||
def check_appium_compatibility(device_id: str) -> dict:
|
||||
"""
|
||||
检查Appium兼容性
|
||||
@@ -217,6 +271,8 @@ def check_appium_compatibility(device_id: str) -> dict:
|
||||
logging.error(f"检查兼容性时出错: {str(e)}")
|
||||
return {"device_id": device_id, "error": str(e)}
|
||||
|
||||
|
||||
|
||||
# 使用示例
|
||||
if __name__ == "__main__":
|
||||
# 获取设备ID(示例)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user