Python 一旦包装好,模块1就不能;导入模块2“;来自同一个项目
我的项目具有以下结构:Python 一旦包装好,模块1就不能;导入模块2“;来自同一个项目,python,python-3.x,module,package,Python,Python 3.x,Module,Package,我的项目具有以下结构: project/ + setup.py + bobafett/ + __init__.py + __main__.py + foo.py 与: \uuuu init\uuuu.py:一个空文件 foo.py:包含bar的定义: \uuuu main\uuuuuuuuuuuuuuuuuuuuupy导入并使用foo.bar: ✓ 在当地,所有措施都很有效: ~/project$python3 bobafett/\uuu main\u
project/
+ setup.py
+ bobafett/
+ __init__.py
+ __main__.py
+ foo.py
与:
:一个空文件\uuuu init\uuuu.py
:包含foo.py
的定义:bar
导入并使用\uuuu main\uuuuuuuuuuuuuuuuuuuuupy
:foo.bar
~/project$python3 bobafett/\uuu main\uuuu.py
foo.bar()
✗ 一旦打包、发布和安装了bobafett
,就再也找不到foo
~/project$python3 setup.py bdist\u wheel
~/project$curl-T。。。https://my-pypi.example.com/simple/bobafett/...
~/project$cd/tmp
/tmp$pip——索引urlhttps://my-pypi.example.com/simple --用户bobafett
/tmp$python-m bobafett
...
文件“/home/ysc/.local/lib/python3.6/site packages/bobafett/\uuuu main\uuuuuu.py”,第1行,在
进口食品
ModuleNotFoundError:没有名为“foo”的模块
怎么样?我可以写什么来代替既可以在本地工作又可以在部署后工作的导入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()".',
)
您可以执行以下操作:
import
更改为from。导入foo
。它将修复运行的python-m bobafett
,但会中断python3 bobafett/\uuuuu main\uuuuu.py
python-m bobafett
而不是python3 bobafett/\uuuu main\uuuu.py
如果你碰巧知道原因并加以解释,我可以接受你的回答。如果没有,我将等待一点,让其他人回答。@YSC我不是100%确定,但结合这两个答案:并给出以下内容:运行
python3 bobafett/\uuu main\uuuuu.py
允许Python使用导入foo
查找foo
,因为它搜索入口点脚本运行的目录。但是当从/tmp
运行时,Python无法做到这一点。因此,我们将从更改为。导入foo
。之后,当您直接执行一个文件时,它没有通常的名称,而是以“\uuuu main\uuuuu”作为其名称。所以相对导入不起作用。
所以改为python-m
import foo
foo.bar()
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()".',
)