安装自己的项目作为依赖项|模块名称问题

时间:2019-09-13 17:39:10

标签: python pip

我有多个项目,我正在研究几个库和几个需要这些库作为依赖项的客户端。

结构

$ pwd
~/Projects/library

$ tree
.
├── api.py
├── __init__.py
└── setup.py

$ cat api.py
import requests

# ...

def process(data):
    for record in data:
        print(f"Processing {record}")

$ cat __init__.py
from .api import process

$ cat setup.py
from setuptools import find_packages, setup

setup(
    name='my_library',
    version='1.0.0',
    packages=find_packages(),
    include_package_data=True,
    zip_safe=False,
    install_requires=[
        'requests',
    ],
)

然后我将代码推送到我的私人github存储库中,现在想将其安装为 client

的依赖项

客户结构

$ pwd
~/Projects/client

$ tree -a -L 1
.
├── .venv
└── client.py

$ cat client.py
from my_library import process

data = list(range(5))
process(data)

$ . .venv/bin/activate
(.venv) $ pip install git+ssh://git@github.com/USER/library.git
...
Installing collected packages: idna, certifi, urllib3, chardet, requests, my-library
  Running setup.py install for my-library ... done
Successfully installed certifi-2019.9.11 chardet-3.0.4 idna-2.8 my-library-1.0.0 requests-2.22.0 urllib3-1.25.3

$ python client.py
Traceback (most recent call last):
  File "client.py", line 1, in <module>
    from my_library import process
ModuleNotFoundError: No module named 'my_library'

我意识到并正在思考的一个问题可能与问题有关;

  • 目录(和存储库)的名称为library(单字)
  • setup.py中,名称为my_libraryname='my_library')(下划线分隔)
  • pip freeze将其显示为my-library==1.0.0(用连字符分隔)

1 个答案:

答案 0 :(得分:1)

您对项目名称和程序包/模块名称感到困惑。

Python导入系统不关心项目名称,只有pip关心。

Python关心软件包和模块,但是您的项目没有软件包,因此find_packages()不会向您的文件夹添加任何内容。

您应该做的是:

  1. 在项目文件夹下创建一个名为my_library的文件夹。
  2. 在此文件夹上放置__init __。py
  3. 将python模块放在此文件夹中。
  4. 从项目文件夹中删除__init __。py。

更多信息here