如何在Python 3中从不同的目录导入模块?

4

我尝试导入一个用于测试的模块,但收到了以下错误:

Traceback(最近的调用最先): 文件“BaseTest.py”,第8行, 来自.main.pageobjects.FBPage导入* ModuleNotFoundError:找不到名为“main.main”的模块;“main”不是包

项目树如下:

/- ProjectDir
/- .src
/- .src.main
/- .src.main.core
/- .src.main.core.BaseCode <- base code to be extended as parent
/- .src.main.core.pageobjects
/- .src.main.core.pageobjects.Module <- a module that inherit from BaseCode 
/- .src.tests
/- .src.tests.BaseTest <- main testing module
/- .src.tests.results

我基本上是在我的BaseTest模块内完成了这个操作:
from .main.pageobjects.Module import *

我在这里做错了什么? :)

请问您可以发布一下其他导入模块可行的情况吗? - deadbug
你使用的是哪个Python版本? - vaultah
Python 3.6.1import os, import sys, import unittest, from selenium import webdriver, from .main.pageobjects.Module import * - SysMurff
2个回答

4

您需要在模块下导入特定的类(或类)。请参见下面的代码片段。我已经在代码下面解释了逻辑。

from src.main.core.pageobjects.Module.module1 import Module1
from src.main.core.pageobjects.Module.module2 import Module2

在模块中,我创建了两个Python文件:module1和module2;在module1中,我创建了一个类-Module1,在module2中,我创建了一个类-Module2。然后我使用下面的代码段来导入包中的这两个类。

src.tests.BaseTest

请点击链接查看项目结构的截图:如何在Python 3中从不同目录导入模块? 在BaseTest模块下,可以查看module1、module2和logintest的Python代码。

module1.py

class Module1(object): def init(self): print('这是一个模块1的示例')

def print_info(self):
    print("this is module 1 print statement")

module2.py

class Module2(object): def __init__(self): print('这是一个模块2的例子')

def print_info(self):
    print("this is module 2 print statement")

src.tests.BaseTest模块下的logintest.py

    from src.main.core.pageobjects.Module.module1 import Module1
from src.main.core.pageobjects.Module.module2 import Module2

m1=Module1()
m2=Module2()
m1.print_info()
m2.print_info()

运行logintest.py并查看结果。结果来自src.main.core.pageobjects.Module包中的module1和module2模块。

C:\Python36\python.exe C:/Users/SeleniumMaster/PycharmProjects/ProjectDir/src/tests/BaseTest/logintest.py
This is a module 1 example
This is a module 2 example
this is module 1 print statement
this is module 2 print statement

Process finished with exit code 0

我按照你的指示做了同样的事情,但仍然收到了之前相同的错误。 - SysMurff
追踪(Traceback)最近的一次调用如下: 在“BaseTest.py”文件的第8行,从“src.main.core.Utils.setup”导入了“load”模块。 但是出现了模块未找到的错误:“No module named 'src'”。 - SysMurff

2

您需要在 /- .src.main.core.pageobjects 中创建一个名为 __init__.py 的文件,然后在 BaseTest.py 中添加以下内容:

import sys
import os
os.chdir('../main/core/pageobjects')
current_dir = os.getcwd()
sys.path.append(current_dir)
from Module import *
do_something

上述代码将路径(/- .src.main.core.pageobjects)添加到PYTHONPATH环境变量中。Python使用PYTHONPATH变量来搜索已导入的模块,因此一旦添加了完整路径,您就可以在任何地方访问Module


init.py文件需要包含一些内容吗? - SysMurff
@SysMurff 不,它应该是一个空文件。 - Alireza
请让我看到错误信息。 - Alireza
让我举个例子来给你解释这个问题。比如说如果你有一个位于 /home/USERNAME/module.py 的模块,你可以将该模块所在的路径 /home/USERNAME/ 添加到 PYTHONPATH 中,这样就可以在任何位置都可以访问它。 - Alireza
好的,我会尝试找出答案 :) - SysMurff
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接