点子安装。只创建dist-info而不是包

时间:2018-05-29 13:08:27

标签: python pip package setup.py

我正在尝试创建一个我想在本地使用pip freeze安装的python包。包名称列在import <package>中,但No module named <package>会导致错误find_packages()。 site-packages文件夹也只包含dist-info文件夹。 import io import os import sys from shutil import rmtree from setuptools import find_packages, setup, Command # Package meta-data. NAME = '<package>' DESCRIPTION = 'description' URL = '' EMAIL = 'email' AUTHOR = 'name' # What packages are required for this module to be executed? REQUIRED = [ # 'requests', 'maya', 'records', ] # The rest you shouldn't have to touch too much :) # ------------------------------------------------ # Except, perhaps the License and Trove Classifiers! # If you do change the License, remember to change the Trove Classifier for that! here = os.path.abspath(os.path.dirname(__file__)) # Where the magic happens: setup( name=NAME, #version=about['__version__'], description=DESCRIPTION, # long_description=long_description, author=AUTHOR, author_email=EMAIL, url=URL, packages=find_packages(), # If your package is a single module, use this instead of 'packages': # py_modules=['mypackage'], # entry_points={ # 'console_scripts': ['mycli=mymodule:cli'], # }, install_requires=REQUIRED, include_package_data=True, license='MIT', classifiers=[ # Trove classifiers # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers 'License :: OSI Approved :: MIT License', 'Programming Language :: Python', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy' ], ) 能够找到包裹。我错过了什么?

public boolean countUsers(UserDetais details){
  List<SystemProfile> systemProfileDataList = getSystemProfileData();
  int userCountForService = service.getUserCountByService(details.id);
  int vpcUsersCount=0;
  int internetUsersCount=0;

   if (systemProfileDataList != null) {
            SystemProfile sysProfile;
            Iterator profileItr = systemProfileDataList.iterator();
      while (profileItr.hasNext()) {
                SystemProfile sysProfile = (SystemProfile) profileItr.next();

     if(sysProfile.getName().equalsIgnoreCase(IPConstants.DEFAULT_MAX_USERS)) {
                    vpcUsersCount = Integer.parseInt(sysProfile.getValue());
                    if (userCountForService > vpcUsersCount) {
                        maxUserFlag = true;
                        break;
                    }
                }else if(sysProfile.getName().equalsIgnoreCase(IPConstants.DEAULT_MAX_USERS_WITH_INTERNET)) {
                    internetUsersCount = Integer.parseInt(sysProfile.getValue());
                    if (userCountForService > internetUsersCount) {
                        maxUserFlag = true;
                        break;
                    }
            }

        }
    }

3 个答案:

答案 0 :(得分:9)

由于该问题已变得非常普遍,因此,当您在安装后丢失文件时,可以通过以下诊断步骤进行操作。想象一下一个具有以下结构的示例项目:

root
├── spam
│   ├── __init__.py
│   ├── data.txt
│   ├── eggs.py
│   └── fizz
│       ├── __init__.py
│       └── buzz.py
├── bacon.py
└── setup.py

现在我运行pip install .,检查是否已安装软件包:

$ pip list
Package    Version
---------- -------
mypkg      0.1    
pip        19.0.1 
setuptools 40.6.3 
wheel      0.32.3 

但是在属于已安装软件包的文件列表中既看不到spamspam/eggs.py也不bacon.pyspam/fizz/buzz.py

$ pip show -f mypkg
Name: mypkg
Version: 0.1
...
Files:
  mypkg-0.1.dist-info/DESCRIPTION.rst
  mypkg-0.1.dist-info/INSTALLER
  mypkg-0.1.dist-info/METADATA
  mypkg-0.1.dist-info/RECORD
  mypkg-0.1.dist-info/WHEEL
  mypkg-0.1.dist-info/metadata.json
  mypkg-0.1.dist-info/top_level.txt

那现在该怎么办?

通过检查车轮制造日志进行诊断

除非被告知不要这样做,否则pip将始终尝试构建wheel文件并从中安装软件包。如果以详细模式重新安装,我们可以检查日志以了解轮的构建过程。第一步是卸载软件包:

$ pip uninstall -y mypkg
...

然后再次安装它,但是现在带有附加参数:

$ pip install . -vvv
...

现在,如果我检查日志:

$ pip install . -vvv | grep 'adding'
  adding 'mypkg-0.1.dist-info/METADATA'
  adding 'mypkg-0.1.dist-info/WHEEL'
  adding 'mypkg-0.1.dist-info/top_level.txt'
  adding 'mypkg-0.1.dist-info/RECORD'

我注意到在任何地方都没有提到spam目录或bacon.py中的文件。这意味着它们根本不包含在wheel文件中,因此pip未安装它们。最常见的错误源是:

缺少软件包:检查packages参数

验证您已将packages参数传递给设置函数。检查您是否已提及应安装的软件包的所有。如果仅提及父包,则不会自动收集子包!例如,在设置脚本中

from setuptools import setup

setup(
    name='mypkg',
    version='0.1',
    packages=['spam']
)

spam将被安装,但spam.fizz不会被安装,因为它本身是一个软件包,必须明确提及。修复它:

from setuptools import setup

setup(
    name='mypkg',
    version='0.1',
    packages=['spam', 'spam.fizz']
)

如果您有很多软件包,请使用setuptools.find_packages自动执行该过程:

from setuptools import find_packages, setup

setup(
    name='mypkg',
    version='0.1',
    packages=find_packages()  # will return a list ['spam', 'spam.fizz']
)

如果您缺少模块:

缺少模块:检查​​py_modules参数

在上述示例中,安装后我将找不到bacon.py,因为它不属于任何软件包。我必须在单独的参数py_modules中提供其模块名称:

from setuptools import find_packages, setup

setup(
    name='mypkg',
    version='0.1',
    packages=find_packages(),
    py_modules=['bacon']
)

缺少数据文件:检查package_data参数

我现在已经准备好所有源代码文件,但是data.txt文件仍未安装。位于软件包目录下的数据文件应通过package_data参数添加。修复以上安装脚本:

from setuptools import find_packages, setup

setup(
    name='mypkg',
    version='0.1',
    packages=find_packages(),
    package_data={'spam': ['data.txt']},
    py_modules=['bacon']
)

不要试图使用data_files参数。将数据文件放在包下,并配置package_data

修复安装脚本后,请在安装后验证软件包文件是否存在

如果我现在重新安装软件包,我会注意到所有文件都已添加到转盘中:

$ pip install . -vvv | grep 'adding'
  adding 'bacon.py'
  adding 'spam/__init__.py'
  adding 'spam/data.txt'
  adding 'spam/eggs.py'
  adding 'spam/fizz/__init__.py'
  adding 'spam/fizz/buzz.py'
  adding 'mypkg-0.1.dist-info/METADATA'
  adding 'mypkg-0.1.dist-info/WHEEL'
  adding 'mypkg-0.1.dist-info/top_level.txt'
  adding 'mypkg-0.1.dist-info/RECORD'

它们也将在属于mypkg的文件列表中可见:

$ pip show -f mypkg
Name: mypkg
Version: 0.1
...
Files:
  __pycache__/bacon.cpython-36.pyc
  bacon.py
  mypkg-0.1.dist-info/INSTALLER
  mypkg-0.1.dist-info/METADATA
  mypkg-0.1.dist-info/RECORD
  mypkg-0.1.dist-info/WHEEL
  mypkg-0.1.dist-info/top_level.txt
  spam/__init__.py
  spam/__pycache__/__init__.cpython-36.pyc
  spam/__pycache__/eggs.cpython-36.pyc
  spam/data.txt
  spam/eggs.py
  spam/fizz/__init__.py
  spam/fizz/__pycache__/__init__.cpython-36.pyc
  spam/fizz/__pycache__/buzz.cpython-36.pyc
  spam/fizz/buzz.py

答案 1 :(得分:0)

如果您使用的是Windows 10+,则可以确保安装正确的一种方法是,单击左下角的开始,搜索cmd.exe,然后右键单击“命令提示符”(确保选择“以管理员身份运行”)。键入“ cd path to your Python 3.X installation”。您可以在文件资源管理器(转到安装Python的文件夹)中然后在顶部找到此路径。复制此内容,并将其放在我在path to your Python 3.X installation上方的位置。完成操作并单击Enter后,键入“ python -m pip install package”(package表示您要安装的软件包)。您的Python程序现在应该可以正常运行了。

答案 2 :(得分:0)

对我来说,如果你这样做,我会注意到一些奇怪的事情:

# Not in the setup.py directory
python /path/to/folder/setup.py bdist_wheel

当您安装轮子时,它只会在您的站点包文件夹中安装 .dist-info 文件夹。

但是,如果您这样做:

cd /path/to/folder \
&& python setup.py bdist_wheel

滚轮将包含您的所有文件。