代码之家  ›  专栏  ›  技术社区  ›  jar

尝试创建应作为命令行脚本使用的自定义包时发生ModuleNotFoundError

  •  1
  • jar  · 技术社区  · 7 年前

    trump 并使用restapi获得一个随机引用。
    注:

    trump  
    |--setup.py  
    |--trump  
       |-- quote.py
       |-- __init__.py
       |-- __main__.py
    

    setup.py

    from setuptools import setup, find_packages
    import sys
    
    if sys.version_info[0] != 3:
        raise RuntimeError('Unsupported python version "{0}"'.format(sys.version_info[0]))
    
    setup(name='trump',
          version='0.1',
          description='Trumps tweets',
          keywords=['trump'],
          #include_package_data=True,
          packages=find_packages('trump'),
          package_dir={'':'trump'},
          license='GNU GPL v3',
          python_requires="!=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
          install_requires=[
              'requests',
          ],
          entry_points = {
                'console_scripts': [
                    'trump = trump.__main__:main'
              ]
          },
          zip_safe=False
          )
    

    __init__.py 是空的。
    __main__.py 包含-

    import quote
    def main():
        quote.vomit()
    
    if __name__=='__main__':
        main() 
    

    以及 quote.py

    import requests
    
    def vomit():
        api_response = requests.get('http://api.tronalddump.io/random/quote')
        quote = api_response.json()['value']
    
        print(quote)
    

    在根目录中运行时 python3 trump 然后我得到正确的结果。但是当我通过pip安装它时 pip3 install --user -e . 王牌 ,我得到以下错误-

     $ trump
    Traceback (most recent call last):
      File "/home/walker/.local/bin/trump", line 11, in <module>
        load_entry_point('trump', 'console_scripts', 'trump')()
      File "/home/walker/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 487, in load_entry_point
        return get_distribution(dist).load_entry_point(group, name)
      File "/home/walker/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2728, in load_entry_point
        return ep.load()
      File "/home/walker/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2346, in load
        return self.resolve()
      File "/home/walker/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2352, in resolve
        module = __import__(self.module_name, fromlist=['__name__'], level=0)
    ModuleNotFoundError: No module named 'trump'
    

    我试着跟着 python packaging docs 但似乎不明白为什么会这样。

    编辑:
    做完之后 packages=find_packages()

    $ pip install --user -e .
    Obtaining file:///trump
        Complete output from command python setup.py egg_info:
        running egg_info
        writing trump/trump.egg-info/PKG-INFO
        writing dependency_links to trump/trump.egg-info/dependency_links.txt
        writing entry points to trump/trump.egg-info/entry_points.txt
        writing requirements to trump/trump.egg-info/requires.txt
        writing top-level names to trump/trump.egg-info/top_level.txt
        error: package directory 'trump/trump' does not exist
    
        ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in /trump/
    

    这使我相信我的配置 package_dir packages 这是错误的。但问题是如果我发表评论 无论是哪种情况 package (有特朗普或空)我得到下面的回答-

    $ trump
    bash: trump: command not found
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   phd    7 年前

    删除 'trump' packages=find_packages('trump') . “特朗普” 是要包含在分发中的包,而 find_packages('trump') 看里面 trump/

    packages=find_packages()
    

    你也不需要 package_dir 完全。如果你有 里面的子目录, src/ 所以你会用

    包目录={'':'src'},