Local 실행할 때는 문제없던 앱이 pyinstaller로 변환하고 나면 에러가 발생한다.
Failed to convert files: Error converting test.docx: docx2pdf Conversion failed: 'NoneType' object has no attribute 'write'
** Pyinstaller로 Non-windowd 옵션으로 변환하면 porcess를 보여주는 라이브러리의 결과 생성을 뿌려줄 곳이 없어지면서 발생하는 오류임
import os
import docx2pdf
# 1. 출력 폴더가 존재하는지 확인하고 없으면 생성
output_folder = "_convert"
if not os.path.exists(output_folder):
os.makedirs(output_folder)
try:
# 2. 명시적인 경로 사용 (상대 경로 대신 절대 경로)
input_path = os.path.abspath("test.docx")
output_path = os.path.abspath(os.path.join(output_folder, "test.pdf"))
# 3. 디버깅 정보 출력
print(f"입력 파일: {input_path}")
print(f"출력 파일: {output_path}")
# 4. 변환 시도
docx2pdf.convert(input_path, output_path)
except Exception as e:
print(f"변환 오류 발생: {e}")
# 오류 상세 정보 출력
import traceback
traceback.print_exc()PyInstaller 관련 추가 해결책
1. --hidden-import 옵션 사용:pyinstaller --hidden-import=win32com.client --hidden-import=docx2pdf your_script.pya = Analysis(
['your_script.py'],
pathex=[...],
binaries=[...],
datas=[...],
hiddenimports=['win32com.client', 'win32com', 'docx2pdf'],
...
)
stackoverflow.com
import sys
class LoggerWriter:
def __init__(self, level):
# self.level is really like using log.debug(message)
# at least in my case
self.level = level
def write(self, message):
# if statement reduces the amount of newlines that are
# printed to the logger
if message != '\n':
self.level(message)
def flush(self):
# create a flush method so things can be flushed when
# the system wants to. Not sure if simply 'printing'
# sys.stderr is the correct way to do it, but it seemed
# to work properly for me.
self.level(sys.stderr)log = logging.getLogger('foobar')
sys.stdout = LoggerWriter(log.debug)
sys.stderr = LoggerWriter(log.warning)# Create Logger if doesn't exist
Path("log").mkdir(parents=True, exist_ok=True)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler = TimedRotatingFileHandler('log/error.log', when="midnight",
interval=1, encoding='utf8')
handler.suffix = "%Y-%m-%d"
handler.setFormatter(formatter)
logger = logging.getLogger()
logger.setLevel(logging.ERROR)
logger.addHandler(handler)
sys.stdout = LoggerWriter(logging.debug)
sys.stderr = LoggerWriter(logging.warning)
0 댓글