gpt4 book ai didi

python - 使子模块在同一 Python 模块内相互可见

转载 作者:太空宇宙 更新时间:2023-11-04 00:47:07 25 4
gpt4 key购买 nike

假设我有一个文件夹 Awesome_stuff/my_module,其中包含以下文件:my_algorithm.pymy_settings.pymy_utils .py。主文件 my_algorithm.py 包含以下几行:

# my_algorithm.py
import my_utils as mu
from my_settings import My_settings

def alg():
# do something

if __name__ == "__main__":
alg()

运行 python my_algorithm.py 不会产生任何问题。但是,如果我想在我的 Python 库中安装此模块,情况就会发生变化。为此,我在 my_module 文件夹内和 my_module 文件夹外添加了一个空的 __init__.py 文件,我放置了一个 setup .py 文件看起来像这样:

from setuptools import setup

setup(
name = 'Awesome_stuff',
version = '1.0.0',
packages = ['my_module'],
# # dependencies
install_requires = ['numpy','scipy', 'numpydoc>=0.5', 'pyomo>=4.3.11388', 'mock>=1.1.3'],
# # project metadata
author = 'Me',
author_email = 'me@mymail.com',
description = 'This module contains awesome stuff',
license = 'BSD',
url = 'http://my_website.com',
download_url = 'my_download_address.com'
)

运行 python setup.py install 生成 egg,模块安装在我的 Python 库中。现在主文件夹 Awesome_stuff 包含:

Awesome_stuff.egg-info
build (folder created during installation)
dist (folder created during installation)
my_module (my original folder plus __init__.py)
setup.py

为了执行与原始 python my_algorithm.py 相同的操作,我现在可以创建一个新的 Python 文件 test.py,其中包含类似 from my_module 的内容.my_algorithm 导入 * 然后执行 alg()

不幸的是,行 from my_module.my_algorithm import * 产生了以下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.macosx-10.11-intel/egg/my_module/my_algorithm.py", line 25, in <module>
ImportError: No module named my_utils

如何在不修改原来三个模块的文件的情况下解决这个问题?我看不出这里出了什么问题。

此外,import my_module 不会产生任何错误。我在这里有点困惑。为什么从同一文件夹导入子模块在模块是独立文件夹时有效,而在安装在 Python 库中时不起作用?

更一般的问题:导入/使用可能相互依赖的子模块的正确/建议方法是什么?文件 __init__.py 可能在这种情况下发挥作用吗?

谢谢。

OS X El 船长,Python 2.7.10

编辑

例如,我查看了 Python 库 Zen ,其结构类似:

Zen
build
zen
folder1
folder2
...
__init__.py
graph.pxd
graph.pyx
digraph.pxd
digraph.pyx
...
Makefile
setup.py

在这种情况下,digraph.pyx(覆盖了一些 graph.pxd 声明)包含行 from graph cimport *,它当然不会造成任何问题。请注意,它不会说:from zen.graph cimport *

最后编辑

当使用 cimport 时,您可以在 setup.py 中定义 package_data 以设置 *.pxd< 的路径 文件。这就是为什么 cimport 不需要上面例子中的绝对导入。然而,这对于 *.py 文件是不可能的(据我所知),唯一的方法是使用绝对和相对导入。

最佳答案

由于您已经添加了一个 __init__.py 文件,所以您已经创建了一个包。所以现在,从包中导入时必须使用该包名称:

# my_algorithm.py
import my_module.my_utils as mu
from my_module.my_settings import My_settings

def alg():
# do something

if __name__ == "__main__":
alg()

关于python - 使子模块在同一 Python 模块内相互可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38991687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com