Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一旦包装好,模块1就不能;导入模块2“;来自同一个项目_Python_Python 3.x_Module_Package - Fatal编程技术网

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()".',
)

您可以执行以下操作:

  • 将导入foo的
    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()".',
    )