Python 从父包导入模块

Python 从父包导入模块,python,python-3.x,import,Python,Python 3.x,Import,我的结构如下所示: package/ setup.py ... package/ __init__.py _foo.py subpackage/ __init__.py bar.py 我正在尝试从内部条导入\u foo: # bar.py from .._foo import baz def myfunc(): baz() # stuff 当以脚本的形式运

我的结构如下所示:

package/
    setup.py
    ...
    package/
        __init__.py
        _foo.py
        subpackage/
            __init__.py
            bar.py
我正在尝试从内部
条导入
\u foo

# bar.py
from .._foo import baz

def myfunc():
    baz()
    # stuff
当以脚本的形式运行
bar.py
时(例如,在Jupyter笔记本中,甚至使用
python bar.py
。如果我使用
python-m package.subpackage.bar作为一个模块运行它,那么它可以工作,但我想找到解决方法)。我无法让它工作:

>>> from . import _foo
ImportError: cannot import name '_foo' from '__main__' (unknown location)
# changing __name__ to 'package' doesn't work etiher
>>> from ._foo import baz
ModuleNotFoundError: No module named '__main__._foo'; '__main__' is not a package
>>> from .. import _foo
ValueError: attempted relative import beyond top-level package

>>> sys.path.append(os.getcwd())
>>> from .._foo import baz
ValueError: attempted relative import beyond top-level package
>>> from ._foo import baz
ModuleNotFoundError: No module named 'package' 

我打算将其发布供公众使用,因此仅适用于我的机器的技巧对我来说并不真正有用(指我发现的一些
sys.path
PYTHONPATH
技巧)。

Python不支持从包中运行脚本,因为

现有解决方案以模块形式运行bar:

python -m package.subpackage.bar
或创建
控制台\u脚本


安装
package
后,将自动生成名为
mybarscript
的Python脚本。它将连接到可调用的
myfunc
中定义的
bar.py

如何导入
bar
中?@DavisHerring我在
bar
中执行此操作,因为它需要来自方法/变量的
\u foo
has。我没有在实际场景中使用这整件事,因为包被构建并放置在
站点包中
或其他任何地方,这就是问题所在吗?如果是这样,这意味着我无法在包内测试代码,因为我正在
bar
中编写它。Python不支持从包内运行脚本的可能重复。放弃吧。我不认为这是必要的,因为网站上已经有其他关于这个的好答案了。您在这里提到的
myfunction
是指
bar.py
中定义的
myfunc
(我在编辑中这样做是因为之前没有定义
myfunction
),还是与其他与入口点相关的内容有关?如果是后者,不要担心。如果是前者,请告诉我把函数名改为“MyFalm”,或者考虑在“MyFunc”的答案中更改它,这样对来宾就更清楚了。是的,它应该是<代码> MyFunc < /C>(编辑)。此可调用项不能接受位置参数,并且它应该解析命令行参数,并在必要时进行设置日志记录。确保
bar.py
在导入时不执行任何操作。非常好。我将在这里添加您提到的关于和的两个链接。如果您愿意,可以在答案中添加它们。(如果你愿意,我会在事后删除评论。)当然。为了将来参考,您可以直接编辑答案。
# in setup.py
from setuptools import setup

setup(
    ...
    entry_points={
        "console_scripts": [
            "mybarscript=package.subpackage.bar:myfunc",
        ]
    }
)