Python:如何导入自定义模块

s4n0splo  于 2023-05-05  发布在  Python
关注(0)|答案(3)|浏览(173)

我刚开始学习Python,对C#\Java有更多的经验。那么,让我头疼的是如何将Python模块导入到另一个自定义模块中?我已经尝试了几件事:
SO: Python can't find my module
SO: Cant import my own modules
SO: Import Error: no module named when importing my own module
还有几个,但这些通常建议我使用相对导入(在导入语句之前使用适当数量的.)。对我来说,它似乎很脆弱,因为据我所知,导入是相对的,并根据file.py的执行位置进行解析。
下面是我在PyCharm中的项目结构:

Project
├───lib
│    ├───__init__.py
│    ├───pages
│    │   ├───__init__.py
│    │   ├───pageA.py
│    │   └───pageB.py
│    └───actions
│        ├───__init__.py
│        ├───actionA.py
│        └───actionB.py
├───tests
│    ├───__init__.py
│    ├───base_test.py
│    └───search_test.py
└───main.py

在我的search_test.py中,我导入了模块from lib.actions.actionA import ActionA,在actionA.py中,我导入了像from lib.pages.pageA import PageA这样的模块。下面是我的main.py

import unittest
from tests.search_test import SearchTest

def create_test_suite():
    test_suite = unittest.TestSuite()
    test_suite.addTest(SearchTest())
    return test_suite

if __name__ == 'main':
    suite = create_test_suite()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

当我在PyCharm中运行它时,它工作得很好。但是现在我需要从控制台运行它:

D:\Projects\Python Projects> python -m unittest project_name.main

我面对的是ImportError: no module named 'lib'用这个:

D:\Projects\Python Projects\project_name> python main.py

什么都没发生
我能做什么?我应该坚持使用相对模式还是导入某种类似Java的包?

t1rydlwq

t1rydlwq1#

我认为您应该切换到project_name文件夹并在其中运行python -m unittest main,而不是python -m unittest project_name.main

gcmastyq

gcmastyq2#

当你面对ImportError时,这意味着Python找不到你的模块。那么,它在哪里寻找模块呢?
也许你的PyCharm工作目录适合你的项目。但是当你从命令行执行它时,Python会在当前目录和PYTHONPATH env变量中查找模块。这个env变量被转换成一个列表,您可以使用

import os
print os.sys.path

请确保您的项目在该路径中,如果不是,则将其目录添加到PYTHONPATH env变量中。你可以检查this answer指令如何。
此外,您可以通过命令行更新env变量,如explaiend here

gijlo24d

gijlo24d3#

模块使用sys.path路径列表导入。你可以看到它包含的内容:

import sys
print(sys.path)

将打印如下内容:

['C:\\Users\\***\\miniconda3\\envs\\science\\python311.zip',
 'C:\\Users\\***\\miniconda3\\envs\\science\\DLLs',
 'C:\\Users\\***\\miniconda3\\envs\\science\\Lib',
 'C:\\Users\\***\\miniconda3\\envs\\science',

您的唯一任务是添加一个表示模块位置的元素。它可以是绝对的,也可以是相对的:

sys.path.append(r'..\..\the folder where my custom lib lives')
print(sys.path)

['C:\\Users\\***\\miniconda3\\envs\\science\\python311.zip',
 'C:\\Users\\***\\miniconda3\\envs\\science\\DLLs',
 'C:\\Users\\***\\miniconda3\\envs\\science\\Lib',
 'C:\\Users\\***\\miniconda3\\envs\\science',
 '..\\..\\the folder where my custom lib lives']

然后像往常一样导入文件,如果文件是扩展名为.py的python脚本,导入时删除扩展名:

import custom_lib as cl

相关问题