2017-07-26 200 views
0

我知道有很多關於「ImportError:No module named ...」的問題,但它們似乎歸結爲沒有__init__.py文件或包目錄不在$PYTHONPATH。我已經檢查了這兩個問題,我的問題並不是他們的問題。導入Python包 - 「ImportError:No module named ...」

我有一個包含協議緩衝區定義的項目。有一個makefile生成Python,Java或Go的源代碼。有一個setup.py文件執行make python。我在此目錄中運行pip install -e .,該目錄可按預期生成源文件。

然後我有一個單獨的項目,我試圖使用生成的protobufs。

讓我說明我的項目:

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 

有什麼我錯過這裏?這似乎應該工作,但我顯然沒有理解一些關鍵的東西。

回答

1

讓說你有如下結構:在main.py

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 

代碼:

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

import myprotos 
+0

@Josh - 能否請你給完整回溯?會幫助我理解。 –