2.0 __init__py及包

文章讲述了在Python中如何处理模块导入问题,特别是在不同目录结构下运行脚本时。通过示例解释了`sys.path`的作用,以及如何通过修改`sys.path`解决找不到模块的问题。同时,介绍了`__init__.py`在Python包管理中的功能,包括批量导入、简化导包以及`__all__`的使用情况。
  1. Directory

新建2个目录,a目录中有个test.py,b目录中有个run.py,现在需要在run.py中调用test.py里的方法

#a/test.py
import random


def random_sex():
    num = random.randint(1, 2)
    if num == 1:
        return '男'
    else:
        return '女'

#b/run.py
from a.test import random_sex
print(random_sex())

在pycharm中右键运行,执行成功

使用python命令运行

python b/run.py

运行失败,提示找不到模块

输出sys.path

print(sys.path)

#output
['D:\\workspace\\pycharm\\py_tools\\_case', 'C:\\Users\\javain\\.pyenv\\pyenv-win\\ver
sions\\3.9.5\\python39.zip', 'C:\\Users\\javain\\.pyenv\\pyenv-win\\versions\\3.9.5\\D
LLs', 'C:\\Users\\javain\\.pyenv\\pyenv-win\\versions\\3.9.5\\lib', 'C:\\Users\\javain
\\.pyenv\\pyenv-win\\versions\\3.9.5', 'D:\\workspace\\pycharm\\py_tools\\venv', 'D:\\
workspace\\pycharm\\py_tools\\venv\\lib\\site-packages']

当前项目的目录并没有添加在sys.path中

#b/run.py
import sys
sys.path.append(r'.')
from a.test import random_sex
random_sex()

执行python b/run.py,运行成功

注:如果py文件在根目录的话

from test import random_sex即可
  1. Python Package

每个python package都会有一个__init__.py文件

__init__.py的作用主要用来批量导入和简化导包

示例

#a/test1.py
def h():
    print('hello')
#a/test.py
import random
def random_sex():
    num = random.randint(1, 2)
    if num == 1:
        return '男'
    else:
        return '女'

如果a/__init__.py中为空的话,那么b/run.py文件使用这个包就必须按照如下方式使用

导入整个文件
from a import test
from a import test1
或者导入文件中的方法
from a.test import random_sex
from a.test1 import h 

如果a/__init__.py不为空的话,且内容如下

from a.test import random_sex
from a.test1 import h
import os

那么b/run.py中就应按如下方式使用

import a
a.random_sex()
a.h()
print(a.os.getcwd())

或者

from a import *
test.random_sex()
test.h()
print(os.getcwd())

如果__init__.py中有__all__参数的话

__all__ = ['h','random_sex','os']

则b/run.py中应按如下方式使用

import a
a.random_sex()
a.h()
print(a.os.getcwd())

如果要使用from的形式的话,需要按如下方式使用

from a import *
random_sex()
h()

从上述实验上来看,没有太大的区别

<think>我们正在处理一个关于repo init命令的问题,用户希望了解如何自定义manifest仓库的URL、分支、清单文件,并跳过repo验证。 根据引用[1],我们知道manifest仓库含配置信息,其中xml文件描述了含哪些git项目、默认分支和远端地址等。 因此,我们需要构建一个repo init命令,其中: -u 或 --manifest-url:指定manifest仓库的URL -b 或 --manifest-branch:指定manifest仓库的分支 -m 或 --manifest-name:指定要使用的清单文件(xml文件) --repo-repository:指定repo工具自己的仓库(可选,但这里用户没有提到) --repo-branch:指定repo工具的分支(可选) --no-repo-verify:跳过repo工具的验证(用户明确要求) 注意:repo init命令的格式为: repo init -u <URL> [选项]... 因此,我们构建的命令可能如下: repo init -u <manifest_url> -b <branch> -m <manifest_file> --no-repo-verify 但是,用户可能还希望指定其他选项,例如深度克隆(--depth)等,但问题中没有提到,所以我们只关注用户提到的。 另外,根据引用[2]和引用[3],它们提供了在离线环境中配置仓库和同步镜像的方法,但与本问题关系不大。引用[4]提供了一些参考链接,可能含更多细节,但这里我们主要关注repo init命令。 因此,我们给出一个具体的命令示例: repo init -u https://github.com/myproject/manifest.git -b main -m default.xml --no-repo-verify 解释: -u:manifest仓库的URL -b:使用manifest仓库的main分支 -m:使用仓库中的default.xml文件作为清单 --no-repo-verify:跳过repo工具的验证(不检查repo工具的签名) 注意事项: 1. 跳过验证(--no-repo-verify)可能会带来安全风险,因为无法验证repo工具本身的完整性。仅在信任的环境中使用。 2. 如果manifest仓库需要认证,可能需要提前配置好凭据(例如SSH密钥或HTTPS用户名密码)。 如果用户需要指定repo工具自己的仓库(通常不需要,因为默认是Google的仓库,但国内可能无法访问),则可以使用: --repo-url:指定repo工具的git仓库 --repo-branch:指定repo工具的git分支 例如,使用清华镜像的repo工具: repo init -u https://github.com/myproject/manifest.git --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-branch=master -b main -m default.xml --no-repo-verify 但是,用户的问题中没有提到需要替换repo工具仓库,所以我们可以不提供,除非用户有特殊需求。 现在,我们按照要求生成相关问题。</think>### 自定义 Repo Init 命令详解 执行 `repo init` 命令时,可通过以下参数自定义配置: ```bash repo init \ -u <MANIFEST_URL> \ # 指定 manifest 仓库 URL -b <BRANCH> \ # 指定 manifest 仓库分支 -m <MANIFEST_FILE> \ # 指定清单 XML 文件 --no-repo-verify # 跳过 repo 工具验证 ``` #### 参数说明: 1. **`-u` (manifest URL)** 指定含 XML 配置的 Git 仓库地址,例如: `-u https://github.com/yourproject/manifests.git` 2. **`-b` (分支)** 定义 manifest 仓库的目标分支,例如: `-b android-13.0` 3. **`-m` (清单文件)** 指定仓库中的 XML 配置文件(默认为 `default.xml`),例如: `-m custom.xml` XML 文件定义了含的 Git 项目、默认分支和远程地址[^1]。 4. **`--no-repo-verify`** 跳过 repo 工具的 GPG 签名验证,适用于可信环境或离线部署场景。 #### 完整示例: ```bash repo init \ -u https://gitee.com/mirrors/android-manifest \ -b android-13.0 \ -m custom_manifest.xml \ --no-repo-verify ``` #### 注意事项: - 跳过验证 (`--no-repo-verify`) 会降低安全性,建议仅在隔离环境中使用 - XML 文件需符合 repo 规范,定义正确的 `<project>` 和 `<remote>` 节点 - 离线环境下需提前同步仓库(参考 `skopeo sync` 或离线部署方案[^2][^3]) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值