Это отлично работает как файл .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}"Обновите перед отправкой этого вопроса. Я уже делал это ранее при запуске программы из другого импортированного файла 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()
Мобильная версия