假设我有一个以下结构的项目
projectfoo/
|- mymodule/
|--|- __init__.py
|--|- library.py
|- preprocessor.py
并且在
__init__.py
中的mymodule
看起来像这样
from . import library #library itself has other functions
def some_function():
blar blar blar...
preprocessor.py
如下所示
import mymodule
def main():
something()
def something():
mymodule.some_function() # calls the function defined in __init__.py
if __name__ == '__main__':
main()
然后我开始了
projectbar
,它使用了projectfoo
中的很多通用代码。因此,我不想在项目之间复制和粘贴代码,而是希望将 projectfoo
导入到项目栏中,如下所示。
projectbar/
|- projectfoo/
|--|- mymodule/
|--|--|- __init__.py
|--|--|- library.py
|--|- preprocessor.py
|- index.py
所以我尝试将
preprocessor
导入到我的 index.py
中,如下
from projectfoo import preprocessor
但是我收到一条错误消息,提示
preprocessor.py
现在无法导入 mymodule
。
ImportError: No module named 'mymodule'
我这样做正确吗?我在我的设置中使用在 ubuntu 14.04 中运行的 python3.4。
编辑:我也尝试将
__init__.py
添加到 projectfoo
,但我仍然遇到相同的错误
您收到此错误是因为您没有将 preprocessor 的路径添加为库包
from sys import path as pylib #im naming it as pylib so that we won't get confused between os.path and sys.path
import os
pylib += [os.path.abspath(r'/projectfoo')]
from projectfoo import preprocessor
仅供参考:os.path 将返回绝对路径。但 sys.path 将返回路径 env。系统设置中的变量。
希望有帮助。
尝试将空的
__init__.py
添加到 projectfoo
文件夹。
您必须在
__init__.py
文件夹中添加一个 projectfoo/
文件(可以为空)才能使其成为有效模块。
然后使用相对导入来显式指定您正在请求当前模块的子模块
mymodule
,如下所示:
from .projectfoo import preprocessor
.
代表包含导入语句的文件所在的当前模块。它的父模块将表示为 ..
,其“祖父母”将表示为 ...
等等。
一种方法是将文件保留为模块并使用“sys”导入它,如下所示:
import sys
sys.path.insert(0, "/absolute/path/to/the/other/project")
import your_module
另一种方法是将其打包并安装。
my_project/
my_module/
__init__.py
my_class.py
在
my_class.py
中,您可能有:
# my_class.py
class MyClass:
...
在
__init__.py
中,您将包括:
# __init__.py
from .my_class import MyClass
setup.py
文件:在my_project/
目录(与my_module/
同级)创建setup.py
文件:# setup.py
from setuptools import setup, find_packages
setup(
name='my_module',
version='0.1',
packages=find_packages(),
)
my_project/
目录并运行以下命令来安装您的软件包:pip install .
from my_module import MyClass