python打包exe执行,把exe放在别的目录执行闪退 为什么?

新手上路,请多包涵

python 打包成exe执行闪退。

代码如下

import logging
from datetime import datetime
import pymysql
from pymysql import cursors, Error as PyMysqlError
import pytz
from apscheduler.schedulers.blocking import BlockingScheduler

# 日志配置保持不变

# 日志配置
logging.basicConfig(
    filename='sync22.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

#logging = logging.getlogging(__name__)

# 修正后的数据库配置
DB_CONFIG = {
    'source': {
        'host': 'localhost',
        'port': 3306,
        'user': 'root',
        'password': 'root',
        'db': 'report',
        'charset': 'utf8',
        'cursorclass': cursors.DictCursor  # 明确指定字典游标
    },
    'target': {
        'host': 'localhost',
        'port': 3306,
        'user': 'root',
        'password': 'root',
        'db': 'report',
        'charset': 'utf8',
        'cursorclass': cursors.DictCursor
    }
}


# --------------------- 数据库连接修正 ---------------------
def get_mdb_connection():
    """修复时区设置"""
    try:
        conn = pymysql.connect(**DB_CONFIG['source'])
        with conn.cursor() as cursor:
            cursor.execute("SET time_zone = '+00:00'")  # 通过SQL设置时区
        return conn
    except PyMysqlError as err:
        logging.error(f"源数据库连接失败: {err}", exc_info=True)
        raise


def get_target_db_connection():
    """修复目标库配置错误"""
    try:
        conn = pymysql.connect(**DB_CONFIG['target'])  # 修正为 target
        with conn.cursor() as cursor:
            cursor.execute("SET time_zone = '+00:00'")
        return conn
    except PyMysqlError as err:
        logging.error(f"目标数据库连接失败: {err}", exc_info=True)
        raise


# --------------------- 关键逻辑修正 ---------------------
def check_record_exists(uid):
    """修复游标类型"""
    try:
        with get_target_db_connection() as conn:
            with conn.cursor(cursors.DictCursor) as cursor:  # 明确指定游标类型
                cursor.execute(
                    "SELECT id FROM my_peiliao WHERE uid = %s",
                    (uid,)
                )
                return bool(cursor.fetchone())
    except PyMysqlError as err:
        logging.error(f"存在性检查失败: {err}", exc_info=True)
        return False

def insert_record(record_data):
    """插入新记录(优化事务处理)"""
    columns = [
        'zlcode', 'order_number', 'weight', 'date',
        'd', 'f', 'h', 'e', 'uid'
    ]
    sql = f"""
    INSERT INTO my_peiliao
    ({', '.join(columns)})
    VALUES ({', '.join(['%s'] * len(columns))})
    """

    try:
        with get_target_db_connection() as conn:
            cursor = conn.cursor()
            cursor.execute(sql, record_data)
            conn.commit()
    except PyMysqlError as err:
        logging.error(f"Insert error: {err}")
        conn.rollback()
        raise

def scheduled_task():
    """修复时区一致性"""
    logging.info("---------- 任务开始 ----------")
    start_time = datetime.now(pytz.utc)  # 统一使用UTC时区

    try:
        with get_mdb_connection() as conn:
            with conn.cursor(cursors.DictCursor) as cursor:
                query = """
                SELECT *
                FROM zg_size_report
                WHERE T = 'T'
                ORDER BY time DESC
                LIMIT 10
                """
                cursor.execute(query)

                processed = 0
                for row in cursor:
                    try:
                        uid = row['ID']
                        if not check_record_exists(uid):
                            record_data = (
                                row['neibuzhilianghao'],
                                row['dingdanhao'],
                                row['total_weight'],
                                row['time'],
                                row['kehu'],
                                row['n_num'],
                                row['j_num'],
                                row['peiliaoyuan'],
                                uid
                            )
                            insert_record(record_data)
                            logging.info(f"已插入新记录: {uid}")
                            processed += 1
                    except Exception as e:
                        logging.error(f"单条记录处理失败: {e}", exc_info=True)

                logging.info(f"处理完成: 成功{processed}条/总共{cursor.rowcount}条")

    except PyMysqlError as err:
        logging.error(f"数据库错误: {err}", exc_info=True)
    except Exception as e:
        logging.error(f"任务异常: {e}", exc_info=True)
    finally:
        elapsed = (datetime.now(pytz.utc) - start_time).total_seconds()
        logging.info(f"任务耗时: {elapsed:.2f}秒\n")


# 其他函数保持不变...

if __name__ == "__main__":
    try:
        scheduler = BlockingScheduler(timezone=pytz.utc)
        scheduler.add_job(
            scheduled_task,
            'cron',
            second='*/1',
            misfire_grace_time=60
        )
        logging.info("程序启动...")
        scheduler.start()
    except Exception as e:
        logging.error(f"致命错误: {e}", exc_info=True)
    finally:
        if 'scheduler' in locals():
            scheduler.shutdown()

我在pyCharm 里执行可以执行成功并打印日志,使用pyinstaller .\report-job-v3.py
命令打包成exe后 在exe生成的目录执行好使image.png 但是exe复制到别的文件夹执行就闪退 且没有生成日志文件

阅读 763
2 个回答
新手上路,请多包涵

把日志配置改了之后打包好使了,可能是日志路径没找到报错了

新增代码:获取exe所在目录并设置日志路径

if getattr(sys, 'frozen', False):

# 打包后的exe路径
exe_dir = os.path.dirname(sys.executable)

else:

# 脚本运行路径
exe_dir = os.path.dirname(os.path.abspath(__file__))

os.makedirs(exe_dir, exist_ok=True)

log_path = os.path.join(exe_dir, 'sync22.log')

日志配置

logging.basicConfig(

filename=log_path,
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'

)

因为并没有打包成单文件,要使用的话需要把整个文件夹都拷贝才行。

可以使用 -F 打包成单文件

pyinstaller -F .\report-job-v3.py

不过可能需要调整资源的路径,已经一些其他问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题