首页 >后端开发 >Python教程 >在 Python 中导入同级包时如何避免'sys.path”黑客攻击?

在 Python 中导入同级包时如何避免'sys.path”黑客攻击?

Patricia Arquette
Patricia Arquette原创
2024-12-11 13:56:10134浏览

How Can I Avoid `sys.path` Hacks When Importing Sibling Packages in Python?

同级包导入:无痛方法

处理 Python 导入时,遇到同级包导入问题可能会令人沮丧。让我们探索一种替代可怕的 sys.path.insert hack 的方法来解决此问题。

项目设置

考虑以下项目结构:

├── LICENSE.md
├── README.md
├── api
│   ├── __init__.py
│   ├── api.py
│   └── api_key.py
├── examples
│   ├── __init__.py
│   ├── example_one.py
│   └── example_two.py
└── tests
│   ├── __init__.py
│   └── test_one.py

问题

当您尝试从示例和测试目录中的 api 模块导入时,您可能会遇到如下错误:

ModuleNotFoundError: No module named 'api'

解决方案< /h2>

这里有一个 Pythonic,而不是诉诸 sys.path hacks解决方案:

第 1 步:创建 pyproject.toml 文件

[project]
name = "myproject"
version = "0.1.0"
description = "My small project"

[build-system]
requires = ["flit_core >=3.2,<4"]
build-backend = "flit_core.buildapi"</p>
<p><strong>第 2 步:使用 pip -e 安装</strong></p>
<p>如果需要,激活您的虚拟环境,然后将您的项目安装在可编辑的环境中state:</p>
<pre class="brush:php;toolbar:false">pip install -e .

第 3 步:调整导入

修改以前无法从 api 模块导入的文件中的导入以包含项目名称,例如:

from myproject.api.api import function_from_api

示例

a pi.py

def function_from_api():
    return 'I am the return value from api.api!'

test_one.py

from myproject.api.api import function_from_api

def test_function():
    print(function_from_api())

if __name__ == '__main__':
    test_function()

运行测试

确保您仍在虚拟环境中并执行以下操作:

python .\myproject\tests\test_one.py

输出:

I am the return value from api.api!

以上是在 Python 中导入同级包时如何避免'sys.path”黑客攻击?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn