【问题标题】:Importing Python package - "ImportError: No module named..."导入 Python 包 - “ImportError: No module named...”
【发布时间】:2017-07-26 10:26:58
【问题描述】:

我知道有很多关于“ImportError: No module named...”的问题,但它们通常归结为没有__init__.py 文件或不在$PYTHONPATH 中的包目录。我已经检查了这两个问题,我的问题不在于它们。

我有一个包含协议缓冲区定义的项目。有一个生成文件可以将源代码生成为 Python、Java 或 Go。有一个setup.py 文件执行make python。我在这个目录中运行了pip install -e .,它按预期生成了源文件。

然后我有一个单独的项目,我正在尝试使用生成的 protobuf。

让我来说明我的项目:

myproject/
├── module
│   ├── __init__.py
│   └── module.py
└── main.py

myprotos/
├── Makefile
├── __init__.py
├── my.proto
├── my_pb2.py (generated by the makefile on install)
├── myprotos.egg-info (generated by setup.py)
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
└── setup.py

setup.py的来源很简单:

import subprocess
import sys

from setuptools import setup
from setuptools.command.install import install

class Install(install):
    """Customized setuptools install command - builds protos on install."""
    def run(self):
        protoc_command = ["make", "python"]
        if subprocess.call(protoc_command) != 0:
            sys.exit(-1)
        install.run(self)


setup(
    name='myprotos',
    version='0.0.1',
    description='',
    install_requires=[],
    cmdclass={
        'install': Install,
    }
)

myprotos 中的 __init__.py 仅包含:

import my_pb2

那么myproject/main.py的内容就是:

import sys
sys.path.insert(0, '/path/to/myprotos')

import myprotos

运行此代码,python main.py 输出:

Traceback (most recent call last):
  File "main.py", line 12, in <module>
    import myprotos
ImportError: No module named myprotos

我在这里错过了什么?看起来这应该可行,但我显然还没有理解一些关键的东西。

【问题讨论】:

    标签: python pip setuptools


    【解决方案1】:

    假设你有以下结构:

    demo_proj
        |
        myproject/
        ├── module
        │   ├── __init__.py
        │   └── module.py
        └── main.py
    
        myprotos/
        ├── Makefile
        ├── __init__.py
        ├── my.proto
        ├── my_pb2.py
        ├── myprotos.egg-info
        │   ├── PKG-INFO
        │   ├── SOURCES.txt
        │   ├── dependency_links.txt
        │   └── top_level.txt
        └── setup.py
    

    ma​​in.py 中的代码:

    import sys
    sys.path.insert(0, '/path/to/demo_proj')
    
    import myprotos
    

    【讨论】:

    • @Josh - 你能给出完整的回溯吗?会帮助我理解。
    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 2015-09-10
    • 1970-01-01
    • 2011-04-08
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多