在Python中导入另一个项目作为模块

问题描述 投票:0回答:4

假设我有一个以下结构的项目

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
,但我仍然遇到相同的错误

python python-3.x python-import
4个回答
4
投票

您收到此错误是因为您没有将 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。系统设置中的变量。

希望有帮助。


2
投票

尝试将空的

__init__.py
添加到
projectfoo
文件夹。


2
投票

您必须在

__init__.py
文件夹中添加一个
projectfoo/
文件(可以为空)才能使其成为有效模块。

然后使用相对导入来显式指定您正在请求当前模块的子模块

mymodule
,如下所示:

from .projectfoo import preprocessor

.
代表包含导入语句的文件所在的当前模块。它的父模块将表示为
..
,其“祖父母”将表示为
...
等等。


0
投票

一种方法是将文件保留为模块并使用“sys”导入它,如下所示:

import sys
sys.path.insert(0, "/absolute/path/to/the/other/project")

import your_module

另一种方法是将其打包并安装。

  1. 将您的项目构建为一个包:确保您的项目具有以下结构:
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
  1. 创建
    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(),
)
  1. 安装您的软件包:导航到终端中的
    my_project/
    目录并运行以下命令来安装您的软件包:
pip install .
  1. 在另一个项目中导入您的类:现在您可以像这样在另一个项目中导入您的类:
from my_module import MyClass
© www.soinside.com 2019 - 2024. All rights reserved.