Python 创建了一个PyPI包并进行了安装,但运行时返回导入错误

Python 创建了一个PyPI包并进行了安装,但运行时返回导入错误,python,pypi,Python,Pypi,我已经创建了一个简单的包,并能够在PyPI中发布它。 它的文件结构是: DaysGrounded\ DaysGrounded\setup.py DaysGrounded\setup.cfg DaysGrounded\requirements.txt DaysGrounded\MANIFEST.in DaysGrounded\daysgrounded\ DaysGrounded\daysgrounded\__init__.py DaysGrounded\daysgrounded\__main__.

我已经创建了一个简单的包,并能够在PyPI中发布它。 它的文件结构是:

DaysGrounded\
DaysGrounded\setup.py
DaysGrounded\setup.cfg
DaysGrounded\requirements.txt
DaysGrounded\MANIFEST.in
DaysGrounded\daysgrounded\
DaysGrounded\daysgrounded\__init__.py
DaysGrounded\daysgrounded\__main__.py
DaysGrounded\daysgrounded\cli.py
DaysGrounded\daysgrounded\gui.py
DaysGrounded\daysgrounded\shared.py
我将其安装在另一台计算机上并运行c:\Python34\Scripts\daysground.exe,但它返回以下错误: 回溯(最近一次呼叫最后一次): 文件“C:\Python34\lib\runpy.py”,第171行,在运行模块中作为主 “main”,模块规格) 文件“C:\Python34\lib\runpy.py”,第86行,在运行代码中 exec(代码、运行\全局) 文件“C:\Python34\Scripts\daysgrounded.exe\uuuuu main\uuuuuuu.py”,第5行,在 文件“C:\Python34\lib\site packages\daysground\uuuuu main\uuuuuuuu.py”,第12行,在 导入cli ImportError:没有名为“cli”的模块

您可以在和中找到该应用程序

我做错了什么?它在setup.py中吗

#!/usr/bin/env python
# -*- coding: latin-1 -*-

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

from setuptools import setup, find_packages
#import py2exe

from daysgrounded import *

setup(
    name=__title__,
    version=__version__,

    description=__desc__,
    long_description=open('README.txt').read(),
    #long_description=(read('README.txt') + '\n\n' +
    #                  read('CHANGES.txt') + '\n\n' +
    #                  read('AUTHORS.txt')),
    license=__license__,
    url=__url__,

    author=__author__,
    author_email=__email__,

    keywords=__keywords__,
    classifiers=__classifiers__,

    packages=find_packages(exclude=['tests*']),
    #packages=__packages__,

    entry_points=__entrypoints__,
    install_requires=open('requirements.txt').read(),
    #install_requires=open('requirements.txt').read().splitlines(),

    include_package_data=True,
    package_data=__pkgdata__,

    #console=['daysgrounded\\__main__.py']
)


Or is it in __init__.py?

"""Manage child(s) grounded days."""

__all__ = [
    '__title__', '__version__',
    '__desc__', '__license__', '__url__',
    '__author__', '__email__',
    '__copyright__',
    '__keywords__', '__classifiers__',
    #'__packages__',
    '__entrypoints__', '__pkgdata__'
]

__title__ = 'daysgrounded'
__version__ = '0.0.8'

__desc__ = __doc__.strip()
__license__ = 'GNU General Public License v2 or later (GPLv2+)'
__url__ = 'https://github.com/jcrmatos/DaysGrounded'

__author__ = 'Joao Matos'
__email__ = 'jcrmatos@gmail.com'

__copyright__ = 'Copyright 2014 Joao Matos'

__keywords__ = 'days grounded'
__classifiers__ = [
        'Development Status :: 4 - Beta',
        'Environment :: Console',
        'Environment :: Win32 (MS Windows)',
        'Intended Audience :: End Users/Desktop',
        'Intended Audience :: Developers',
        'Natural Language :: English',
        'Natural Language :: Portuguese',
        'License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)',
        'Operating System :: OS Independent',
        'Programming Language :: Python',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3.4',
        'Topic :: Other/Nonlisted Topic',
        # Use below to prevent any unwanted publishing
        #'Private :: Do Not Upload'
    ]

#__packages__ = ['daysgrounded']

__entrypoints__ = {
        'console_scripts': ['daysgrounded = daysgrounded.__main__:main'],
        #'gui_scripts': ['app_gui = daysgrounded.daysgrounded:start']
    }

__pkgdata__ = {'daysgrounded': ['*.txt']}
#__pkgdata__= {'': ['*.txt'], 'daysgrounded': ['*.txt']}
谢谢


JM这是由于以下各项之间的差异:

  • python daysgrounded
  • python daysgrounded/\uuuuu main\uuuuuu.py
  • python-m daysgrounded
  • 如果您在您的项目中尝试每种方法,您会注意到第三种方法不起作用,这正是
    runpy
    使用的方法。它不起作用的原因是您的
    sys.path
    不正确,因为python在
    sys.path
    中添加了
    daysground/
    作为前两种方法,而不是第三种方法

    为了使这三种方法都有效,您必须确保sys.path是正确的,有两种方法可以做到这一点

    如果您希望能够执行导入cli,
    sys.path
    应该是
    daysground/
    ,这意味着您需要修改
    \uuu init\uuuuuuuupy
    将其添加到
    sys.path

    import sys
    import os.path
    sys.path.insert(1, os.path.dirname(__file__))
    
    import sys
    import os.path
    sys.path.insert(1, os.path.dirname(sys.path[0]))
    
    如果您希望能够从daysground import cli执行
    sys.path
    应该是
    daysground/
    上方的目录,这意味着您需要修改
    \uuuu main\uuuuuuuuuu.py
    以将其添加到
    sys.path

    import sys
    import os.path
    sys.path.insert(1, os.path.dirname(__file__))
    
    import sys
    import os.path
    sys.path.insert(1, os.path.dirname(sys.path[0]))
    

    你好,谢谢。我的应用程序需要位于同一目录中的一些文本文件。安装后,程序抱怨找不到文本文件。它们位于c:\Python34\Lib\site packages\days中,与所有其他文件一起舍入。例如,我如何在不使用完整路径的情况下指定此默认位置,以允许应用程序为在其他驱动器号中安装Python的用户工作?谢谢JM@jmatos
    open()
    等的相对路径与当前工作目录相对。如果您希望能够使用相对路径,则必须将当前工作目录更改为模块所在的位置(即
    sys.path[0]
    的某些变体,请参阅主要答案)。(更好的)替代方法是使用从每个相对路径到模块目录构造一个绝对路径。您好,谢谢。相反,我这样做了`#为所有数据文件设置正确的路径尝试:data#u path=resource#u filename(name,globalcfg.USAGE#u FILE)data#u path=data#u path.replace(globalcfg.USAGE#FILE.),除了:#如果当前模块被冻结,如果hasasttr(sys,'freezed'):data#path=sys.prefix data#path.strip('/'))DATA_PATH+='/'`这适用于“正常”和冻结的构建。每个数据文件都被保存并从模块/exe所在的位置读取,这正是我想要的。@jmatos您将
    数据路径=…
    代码放在哪里了?这是在
    setup.py
    还是
    \uuuu init\uuuu.py
    中?