Запустите пакетный файл после того, как программа Python скомпилирована в файл .exe.Python

Программы на Python
Ответить
Anonymous
 Запустите пакетный файл после того, как программа Python скомпилирована в файл .exe.

Сообщение Anonymous »

У меня есть приложение Python tkinter, которое создаст и запустит пакетный файл после закрытия окна tkinter.
Это отлично работает как файл .py.
Однако, когда я компилирую приложение с помощью pyinstaller как однофайловое приложение .exe. Пакетный файл не запускается.
Я думал, что это из-за временной папки, которую onefile создает во время выполнения. Я пробовал много разных подходов, которые работают с Python, но не с exe-файлом.
Вот строка, с которой у меня возникли проблемы, или, по крайней мере, я так думаю:

Код: Выделить всё

subprocess.Popen([BATCH_FILE], cwd=exe_dir, shell=True)
Я пробовал

Код: Выделить всё

subprocess.Popen([BATCH_FILE])
и

Код: Выделить всё

subprocess.Popen(f"{exe_dir}\{BATCH_FILE}"
где exe_dir — каталог, содержащий фактический файл и пакетный файл.
Обновите перед отправкой этого вопроса. Я уже делал это ранее при запуске программы из другого импортированного файла Python. Первый файл ниже отлично работает как с файлом .py, так и с файлом .exe. Второй также отлично работает как файл .py, но не запускается при компиляции в файл .exe.

Код: Выделить всё

import os
import subprocess
import sys

def create_and_run_batch(network_path, filename):
# Validate inputs
if not network_path or not filename:
raise ValueError("Network path and filename must be provided.")

# Ensure current directory is safe
current_dir = os.getcwd()
dest_path = os.path.join(current_dir, filename)

# Batch file content
batch_content = f"""@echo off
REM Copy file from network path to current directory
copy "{os.path.join(network_path, filename)}" "{dest_path}"
finally:
del "%~f0" >nul 2>&1
"""

# Save batch file
batch_file = os.path.join(current_dir, "copy_file.bat")
try:
with open(batch_file, "w", encoding="utf-8") as f:
f.write(batch_content)
except OSError as e:
print(f"Error writing batch file: {e}")
sys.exit(1)

# Run batch file silently
try:
subprocess.Popen(
["cmd.exe", "/c", batch_file],
shell=False,
creationflags=subprocess.CREATE_NO_WINDOW
)
print(f"File copied to: {dest_path}")
except subprocess.SubprocessError as e:
print(f"Error running batch file: {e}")

network_drive_path = r'\\faa.gov\faafile\ato\ASO\ro\rtl-share\Quality Assurance\CSSI DailyTracker'
file_to_copy = "CSSI_QA_Validator_DailyData_UD.exe"
create_and_run_batch(network_drive_path, file_to_copy)
А вот скрипт, который не запускает командный файл:

Код: Выделить всё

import os
import subprocess
import sys

BATCH_FILE = "run_script.bat"

def create_and_write_file(filename, content):
try:
folder_path = r"C:\yyyy"
file_name = "output.txt"
file_path = os.path.join(folder_path, file_name)
# 'w' mode creates the file if it doesn't exist, or overwrites it if it does
with open(file_path, 'w', encoding='utf-8') as file:
file.write(content)
print(f"File '{filename}' created and written successfully.")
except OSError as e:
print(f"Error creating/writing file: {e}")

def create_and_run_batch():

#batch_path = (rf"{pth}\{BATCH_FILE}")
#print(f"batch_path ={batch_path}")
batch_content = f"""
@echo off
setlocal enabledelayedexpansion

:: ===== CONFIGURATION =====
set "targetFile=CSSI_QA_Validator_DailyData.exe"   :: File to delete
set "triggerFile=CSSI_QA_Validator_DailyData_UD.exe"  :: File to rename if it exists

:: ===== CHECK AND RENAME =====
if exist "%triggerFile%" (
:: ===== CHECK AND DELETE =====
if exist "%targetFile%" (
del /f /q "%targetFile%"
ren "%triggerFile%" "%targetFile%"
) else (
REM echo "%targetFile%" not found. Skipping deletion.
)
) else (
REM echo "%triggerFile%" not found.  Skipping rename.
)

del "%~f0" >nul 2>&1
endlocal
REM pause
"""
current_dir = os.getcwd()
# Save batch file
batch_file = os.path.join(current_dir, "run_script.bat")
print(f"batch_file = {batch_file}")
try:
with open(batch_file, "w", encoding="utf-8") as f:
f.write(batch_content)
except OSError as e:
print(f"Error writing batch file: {e}")
sys.exit(1)

# Run batch file silently
try:
subprocess.Popen(
["cmd.exe", "/c", batch_file],
shell=False,
creationflags=subprocess.CREATE_NO_WINDOW
)
#print(f"File copied to: {dest_path}")
except subprocess.SubprocessError as e:
print(f"Error running batch file: {e}")

create_and_write_file("test.txt",batch_path)

# Example usage:
# first a hard coded path
#pth=r"E:\python_work\CSSI_QA_Data_Input"
#pth=r"C:\Python\WPy64-31241\scripts\dist"

create_and_run_batch()
Мне удалось заставить файл Bat записаться, но не запуститься. Однако текущая версия даже не записывает файл Bat.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»