我刚开始学习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的包?
3条答案
按热度按时间t1rydlwq1#
我认为您应该切换到project_name文件夹并在其中运行
python -m unittest main
,而不是python -m unittest project_name.main
gcmastyq2#
当你面对
ImportError
时,这意味着Python找不到你的模块。那么,它在哪里寻找模块呢?也许你的PyCharm工作目录适合你的项目。但是当你从命令行执行它时,Python会在当前目录和
PYTHONPATH
env变量中查找模块。这个env变量被转换成一个列表,您可以使用请确保您的项目在该路径中,如果不是,则将其目录添加到
PYTHONPATH
env变量中。你可以检查this answer指令如何。此外,您可以通过命令行更新env变量,如explaiend here
gijlo24d3#
模块使用
sys.path
路径列表导入。你可以看到它包含的内容:将打印如下内容:
您的唯一任务是添加一个表示模块位置的元素。它可以是绝对的,也可以是相对的:
然后像往常一样导入文件,如果文件是扩展名为
.py
的python脚本,导入时删除扩展名: