Ошибка разрешения при запуске .exe из pyinstaller, но .py работает нормально - PullRequest
0 голосов
/ 13 июля 2020

РЕДАКТИРОВАТЬ: Полное переписывание вопроса после комментариев.

Приведенный ниже код работает нормально, если я запускаю его из интерпретатора, но если я запускаю ту же программу, что и файл .exe, созданный с помощью pyinstaller, он не работает с [Errno 13] Permission denied: 'c:/test/test.docx'. Кроме того, если я запускаю тот же exe из окна admin cmd , я получаю ту же ошибку .

Это сводит меня с ума в течение нескольких часов. Есть идеи, как это отладить? (это на windows 10 enterprise P C с python 3.6).

"""
        test.py
"""
import os
import zipfile
file = r'c:/test/test.docx'
print(f"{file} os.path.exists? {os.path.exists(file)}")
print(f"{file} os.path.isfile? {os.path.isfile(file)}")
print(f"open {file}")
with open(file, "rb") as f:
    print(f"fread & print first 20 chars:")
    print(f.read()[0:20])

Если я запустил этот код с python:

C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts>..\python test.py
c:/test/test.docx os.path.exists? True
c:/test/test.docx os.path.isfile? True
open c:/test/test.docx
fread & print first 20 chars:
b'PK\x03\x04\x14\x00\x06\x00\x08\x00\x00\x00!\x00\xecq\x1c\xa0\xf0\x01'

Сейчас Я генерирую exe-файл:

C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts>pyinstaller --onefile test.py
338 INFO: PyInstaller: 3.6
339 INFO: Python: 3.6.8
340 INFO: Platform: Windows-10-10.0.18362-SP0
344 INFO: wrote C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts\test.spec
352 INFO: UPX is not available.
358 INFO: Extending PYTHONPATH with paths
['C:\\Users\\<user>\\AppData\\Local\\Programs\\Python\\Python36-32\\Scripts',
 'C:\\Users\\<user>\\AppData\\Local\\Programs\\Python\\Python36-32\\Scripts']
359 INFO: checking Analysis
367 INFO: Building because C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts\test.py changed
368 INFO: Initializing module dependency graph...
387 INFO: Caching module graph hooks...
427 INFO: Analyzing base_library.zip ...
7130 INFO: Caching module dependency graph...
7305 INFO: running Analysis Analysis-00.toc
7352 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\python.exe
7508 INFO: Analyzing C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts\test.py
7516 INFO: Processing module hooks...
7517 INFO: Loading module hook "hook-encodings.py"...
7998 INFO: Loading module hook "hook-pydoc.py"...
8008 INFO: Loading module hook "hook-xml.py"...
8519 INFO: Looking for ctypes DLLs
8519 INFO: Analyzing run-time hooks ...
8531 INFO: Looking for dynamic libraries
8763 INFO: Looking for eggs
8764 INFO: Using Python library C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\python36.dll
8765 INFO: Found binding redirects:
[]
8778 INFO: Warnings written to C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts\build\test\warn-test.txt
8849 INFO: Graph cross-reference written to C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts\build\test\xref-test.html
8884 INFO: checking PYZ
8890 INFO: Building because toc changed
8890 INFO: Building PYZ (ZlibArchive) C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts\build\test\PYZ-00.pyz
9629 INFO: Building PYZ (ZlibArchive) C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts\build\test\PYZ-00.pyz completed successfully.
9664 INFO: checking PKG
9673 INFO: Building because toc changed
9674 INFO: Building PKG (CArchive) PKG-00.pkg
11417 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
11427 INFO: Bootloader C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PyInstaller\bootloader\Windows-32bit\run.exe
11427 INFO: checking EXE
11437 INFO: Building because toc changed
11438 INFO: Building EXE from EXE-00.toc
11445 INFO: Appending archive to EXE C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts\dist\test.exe
11498 INFO: Building EXE from EXE-00.toc completed successfully.

Если я сейчас запустил .exe:

C:\Users\<user>\AppData\Local\Programs\Python\Python36-32\Scripts>dist\test.exe
c:/test/test.docx os.path.exists? True
c:/test/test.docx os.path.isfile? True
open c:/test/test.docx
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    with open(file, "rb") as f:
PermissionError: [Errno 13] Permission denied: 'c:/test/test.docx' # <<<<<<<<
[3640] Failed to execute script test

РЕДАКТИРОВАТЬ 2: После дополнительных исследований этот случай происходит, когда файл зашифрован с помощью "Azure Защита информации »с учетной записью на уровне домена. Эта программа DLP представляет собой своего рода DRM для защиты офисных файлов, например, на корпоративном P C. Странно то, что выполнение приведенного выше кода дает разные результаты в зависимости от способа запуска. Я мог бы подумать, что использование python для запуска .py и запуска coresponding .exe будет использовать те же учетные данные, что и пользователь, и, таким образом, даст те же результаты, но результаты будут разными.

Файлы, которые зашифрованы иметь установленный бит FILE_ATTRIBUTE_ENCRYPTED, который вы можете обнаружить с помощью:

def is_encrypted(path):
    return os.stat(path).st_file_attributes & stat.FILE_ATTRIBUTE_ENCRYPTED

, и в моем случае идентификатор, используемый для шифрования, связан с доменом (пока не знаю, что, поскольку я не нашел документации на нем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...