Skip to main content

Python代码打包上传

为了让你的项目结构更具组织性,同时支持模块化开发,可以在my_project中添加一个额外的目录来存放自定义的功能模块。在包含外部库的同时,拥有一个清晰的目录结构。下面是调整后的项目目录结构建议:

项目目录结构

假设项目名为my_project,包含自定义子模块和外部库,目录结构可以设计为:

my_project/
├── __main__.py # 主入口文件,应用程序启动的地方
├── libs/ # 放置外部库的目录
│ ├── jieba/
│ ├── pandas/
│ └── numpy/
└── my_module/ # 自定义功能模块目录
├── __init__.py # 使模块成为一个包
└── utils.py # 示例自定义模块

步骤详细解析

  1. 设置主入口文件

    __main__.py中编写应用程序的启动逻辑。确保成功引入外部库和自定义模块:

    # __main__.py
    import sys

    # 确保程序能够找到libs目录,以导入第三方库
    sys.path.insert(0, 'libs')

    import jieba
    import pandas as pd
    import numpy as np
    from my_module import utils

    def main():
    print("Libraries and custom modules loaded successfully!")
    # 示例:使用jieba分词
    seg_list = jieba.cut("我是AI助手")
    print("分词结果: " + "/".join(seg_list))

    # 示例:调用自定义模块的功能
    utils.sample_function()

    if __name__ == "__main__":
    main()
  2. 安装并复制外部库到项目目录

    首先,确保使用虚拟环境来管理依赖,然后将必要的库复制到libs目录中。

    1. 调整本地PowerShell支持权限策略

      因为后续Windows激活虚拟环境时使用了ps脚本,默认情况下Windows PowerShell的执行策略会阻止脚本的运行,这个策略是Windows用来保护系统防止运行未授权脚本的方法。你可以通过更改PowerShell的执行策略来解决此问题。

      power shell

      • 打开PowerShell以管理员身份运行
      • 查看当前执行策略
      Get-ExecutionPolicy
      • 将执行策略更改为RemoteSigned
      Set-ExecutionPolicy RemoteSigned
      • 如果系统提示确认更改,请输入“Y”确认
    2. 创建虚拟环境并安装库

    同之前一样,创建虚拟环境并安装依赖:

        PS D:\Coding Test\my_project> Get-ExecutionPolicy
    RemoteSigned
    # 创建mVenv虚拟环境
    PS D:\Coding Test\my_project> python -m venv mVenv
    # 适用于macOS/Linux
    # source mVenv/bin/activate
    PS D:\Coding Test\my_project> .\mVenv\Scripts\activate
    (mVenv) PS D:\Coding Test\my_project> pip install jieba numpy pandas

    安装完成后,效果如下:

    venv

    1. 复制库到libs目录

    找到虚拟环境的site-packages目录,然后将需要的库复制到my_project/libs中(注意操作系统的区别):

    (mVenv) PS D:\Coding Test\my_project> cd .\mVenv\Lib\site-packages\
    # 将项目所需的库复制到项目libs目录下
    (mVenv) PS D:\Coding Test\my_project\mVenv\Lib\site-packages> Copy-Item -Recurse -Path "jieba", "pandas", "numpy" -Destination "D:\Coding Test\my_project\libs\"
    # Linux下面复制
    cp -r jieba pandas numpy <your_project_path>/my_project/libs/
  3. 添加自定义模块

    my_module目录中创建utils.py,这是一个示例自定义模块:

    # my_module/utils.py

    def sample_function():
    print("This is a sample function from the custom module!")
  4. 打包为 .pyz 文件

    在所有功能在虚拟环境内都调试通过后,就可以退出虚拟环境,并删除虚拟目录。在项目目录外(即my_project父目录)运行以下命令,以将项目打包为.pyz文件:

    (venv) PS D:\Coding Test> deactivate
    PS D:\Coding Test> cd .\my_python_task\
    PS D:\Coding Test\my_python_task> dir
    目录: D:\Coding Test\my_python_task
    Mode LastWriteTime Length Name
    ---- ------------- ------ ----
    d----- 2024/10/11 17:41 docs
    d----- 2024/10/11 18:23 libs
    d----- 2024/10/11 18:31 my_module
    d----- 2024/10/11 17:42 venv
    -a---- 2024/10/11 18:17 447 __main__.py
    PS D:\Coding Test\my_python_task> Remove-Item -Recurse -Force .\venv\
    # 创建压缩包
    PS D:\Coding Test> python -m zipapp .\my_python_task\ -o my_python_task.pyz

    在Linux下可以:

    rm -rf venv
  5. 在 .NET 中执行

    使用前面的示例,借助Process类来执行生成的.pyz文件。

额外注意事项

  • 在打包之前,确保删除所有不必要的文件夹,如__pycache__
  • 为了保证可移植性,开发和运行环境需要兼容的Python版本。
  • 在实际项目中,可能需要根据需要增加更多的自定义模块或者调整目录结构。

这样设计可以确保项目结构清晰,易于管理扩展,同时又能独立运行,不依赖于外部Python环境中的库。