尝试 运行 使用 setuptools 创建的可执行文件时出现 ModuleNotFoundError

ModuleNotFoundError when trying to run executable created with setuptools

这是我的项目结构

/Users/tom/PycharmProjects/foo
├── __init__.py
├── foo
│   ├── __init__.py
│   ├── app.py
│   └── run.py
└── setup.py

app.py:

def hello_world():
    print("Hello world")

run.py:

from foo.app import hello_world

def main():
    hello_world()

setup.py:

from setuptools import setup, find_packages

setup(
    name='foo',
    version='0.0.1',
    packages=find_packages(),
    entry_points={
        'console_scripts': [
            'foo=foo.run:main',
        ]
    }
)

使用 pip 安装后,我有以下文件夹结构:

/Users/tom/Desktop/foo/
├── bin
│   └── foo
├── foo
│   ├── __init__.py
│   ├── app.py
│   └── run.py
└── foo-0.0.1.dist-info
    ├── INSTALLER
    ├── METADATA
    ├── RECORD
    ├── REQUESTED
    ├── WHEEL
    ├── direct_url.json
    ├── entry_points.txt
    └── top_level.txt

当 运行 在 /bin 中执行可执行文件 foo 时,我收到以下错误:

Traceback (most recent call last):
  File "/Users/tom/Desktop/foo/bin/foo", line 5, in <module>
    from foo.run import main
ModuleNotFoundError: No module named 'foo'

如何在 无需激活虚拟环境并从中 运行 的情况下 运行可执行文件?

我通过将 run.py 中的导入语句更改为:

解决了这个问题
from app import hello_world

和setup.py到:

scripts=['foo/app.py', 'foo/run.py'],
entry_points={
    'console_scripts': [
        'hello-world=run:main'
    ]
}

使用 pip 安装后,app.pyrun.py 被添加到 /bin 中,这似乎解决了问题。