【问题标题】:Once packaged, module1 cannot "import module2" from the same project打包后,module1 无法从同一个项目中“导入 module2”
【发布时间】:2020-02-09 00:19:53
【问题描述】:

我的项目结构如下:

project/
  + setup.py
  + bobafett/
    + __init__.py
    + __main__.py
    + foo.py

与:

  • __init__.py: 一个空文件
  • foo.py:包含bar的定义:
def bar():
    print("foo.bar()")
  • __main__.py导入使用foo.bar
import foo
foo.bar()

✓ 在本地,一切正常:

~/project $ python3 bobafett/__main__.py
foo.bar()

✗ 一旦 bobafett 被打包、发布和安装,foo 就找不到了

~/project $ python3 setup.py bdist_wheel
~/project $ curl -T ... https://my-pypi.example.com/simple/bobafett/...
~/project $ cd /tmp
/tmp $ pip --index-url https://my-pypi.example.com/simple --user bobafett
/tmp $ python -m bobafett
...
  File "/home/ysc/.local/lib/python3.6/site-packages/bobafett/__main__.py", line 1, in <module>
    import foo
ModuleNotFoundError: No module named 'foo'

怎么样?我可以写什么来代替import foo 既可以在本地工作又可以在部署后使用?我需要改变我的项目结构吗?


setup.py:

from setuptools import setup

setup(
    name='bobafett',
    version='1.0.0',
    author='YSC',
    author_email='ysc@example.com',
    packages=['bobafett'],
    url='https:///my-pypi.example.com/simple/bobafett/',
    description='Prints "foo.bar()".',
)

【问题讨论】:

    标签: python python-3.x module package


    【解决方案1】:

    您可以执行以下操作:

    1. import foo 更改为from . import foo。它将修复运行 python -m bobafett 但会中断 python3 bobafett/__main__.py
    2. 以与打包时相同的方式在本地运行:python -m bobafett 而不是python3 bobafett/__main__.py

    【讨论】:

    • 它确实有效:) 如果你碰巧知道原因并解释它,我可以接受你的回答。如果没有,我会稍等一下,让其他人回答。
    • @YSC 我不是 100% 确定,但是结合这两个答案:stackoverflow.com/a/4383597/9609843stackoverflow.com/a/11537218/9609843 给出以下结果:运行 python3 bobafett/__main__.py 允许 Python 找到 fooimport foo,因为它搜索the directory that the entry-point script is running from。但是当从/tmp 运行时,Python 无法做到这一点。因此我们更改为from . import foo。之后When you execute a file directly, it doesn't have its usual name, but has "__main__" as its name instead. So relative imports don't work. 所以改成python -m
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多