为了账号安全,请及时绑定邮箱和手机立即绑定

PyCharm 导入与解释器

PyCharm 导入与解释器

慕容3067478 2023-12-08 17:21:43
PyCharm 项目结构如下:testImport    target        __init__.py        script_1.py        script_2.py内容如下:#script_1.pyimport datetimenow_ts = datetime.datetime.now()#script_2.pyfrom script_1 import now_tsprint('Now: {}'.format(now_ts))PyCharm 要求我更正script_2.py文件中的导入行并使用from target.script_1 import now_ts. 一旦我尝试执行,~/testImport: ./target/script_2.py我就会得到ModuleNotFoundError: No module named 'target'。PyCharm 怎么可能建议错误的解决方案,或者是否发生了我不知道的事情?
查看完整描述

2 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

PyCharm 建议可能是因为 IDE 认为您的target文件夹是一个模块。模块中包含可执行脚本被视为反模式。

我对此以及任何其他提议的主要 机械的调整都是-1。唯一的用例似乎是运行恰好位于模块目录内的脚本,我一直将其视为反模式。为了让我改变主意,你必须让我相信事实并非如此。

我建议您更改项目的结构,使主要逻辑位于模块中,而可执行文件位于模块之外,即:

testImport
├── script_1.py
└── target
    └── my_logic.py

在你的 script_1.py 中:

from target.my_logic import now_ts

注意:当然,我在这里只是使用对权威的呼吁作为论据。根据您的用例,继续您正在开发的方式可能会更好。在这种情况下,只需忽略 IDE 建议即可。


查看完整回答
反对 回复 2023-12-08
?
ITMISS

TA贡献1871条经验 获得超8个赞

关键是,当您以默认方式运行脚本时python ./target/script_2.py,解释器将被视为script_2主模块,不会让您找到上层文件夹。


您可以通过以下方式来避免运行ModuleNotFoundError(仅当您清楚地了解自己在做什么时,不要在大型项目中使用):


在~/testImport运行中python -m target.script_2

script_2.py 添加在顶部

__package__ = "target.script_2"

script_2.py 添加在顶部

if __name__ == "__main__":

    import sys

    import os

    sys.path.insert(0, os.path.abspath(os.curdir))

进入~/testImport并运行python ./target/script_2.py


如果有人能帮助我纠正我不自然的英语,我将非常感激。


查看完整回答
反对 回复 2023-12-08
  • 2 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信