怎么根据一个文件夹下的python文件(.py)来获得所有需要的包（生成requirements.txt），注意不是python编译器本身的，而是根据文件夹下的文件

要根据一个文件夹下的 Python 文件（`.py`）自动分析并生成 `requirements.txt`（包含依赖的第三方包），可以使用以下方法：

---

### **方法 1：使用 `pipreqs`（推荐）**

**`pipreqs`** 是一个专门用于扫描项目目录并生成 `requirements.txt` 的工具，它只分析项目实际导入的包，而不是虚拟环境中的所有包。

#### **步骤**

1. **安装 `pipreqs`**：
    
    bash
    
    pip install pipreqs
    
2. **运行扫描**（在目标文件夹下执行）：
    
    bash
    
    pipreqs /path/to/your/folder --encoding=utf-8 --force
    
    - `--encoding=utf-8`：避免编码问题。
        
    - `--force`：覆盖已有的 `requirements.txt`。
        
3. **输出结果**：
    
    - 会在目标文件夹下生成 `requirements.txt`，内容类似：
        
        text
        
        requests==2.25.1
        numpy==1.21.0
        

---

### **方法 2：使用 `pigar`**

**`pigar`** 是另一个类似工具，支持更详细的依赖分析（包括 Git 仓库）。

#### **步骤**

1. **安装 `pigar`**：
    
    bash
    
    pip install pigar
    
2. **运行扫描**：
    
    bash
    
    pigar -p /path/to/your/folder/requirements.txt
    

---

### **方法 3：手动分析（适用于简单场景）**

如果不想安装工具，可以手动提取导入的包：

1. **递归查找所有 `.py` 文件**：
    
    bash
    
    grep -rhE '^import |^from [a-zA-Z0-9._]+ import' /path/to/folder > imports.txt
    
    - 这会提取所有 `import` 和 `from ... import` 语句。
        
2. **手动整理**：
    
    - 删除标准库（如 `os`、`sys` 等）。
        
    - 将第三方包名称写入 `requirements.txt`（版本需手动指定或通过 `pip freeze` 匹配）。
        

---

### **注意事项**

1. **版本精确性**：
    
    - `pipreqs` 生成的版本可能较旧，建议结合 `pip freeze` 检查最新版本：
        
        bash
        
        pip freeze | grep package_name
        
2. **动态导入**：
    
    - 工具可能无法检测动态导入（如 `importlib.import_module`），需手动补充。
        
3. **虚拟环境**：
    
    - 确保在项目虚拟环境中运行扫描，避免污染全局环境。
        
4. **排除测试文件**：
    
    - 如果测试文件（如 `test_*.py`）中有额外依赖，可通过 `--ignore` 忽略：
        
        bash
        
        pipreqs --ignore=tests /path/to/folder
        

---

### **示例输出（requirements.txt）**

plaintext

requests==2.25.1
numpy==1.21.0
pandas==1.3.0

---

### **总结**

|工具|优点|缺点|
|---|---|---|
|`pipreqs`|轻量、精准分析实际导入的包|可能遗漏动态导入|
|`pigar`|支持 Git 和更复杂分析|依赖较多|
|手动提取|无需安装工具|