所以我一直在摆弄,并且已经用Python做了一些认真的工作已经有一段时间了。虽然,我偶尔也会遇到一些问题。
在使用Python时,我发现使用PyCharm CE
时最舒服。典型的情况是我只是创建一个新的virtualenv
,启动PyCharm并在那里打开我的virtualenv
。从那以后,它就像自动驾驶一样,PyCharm处理与site-packages
和Python运行时使用相关的所有脏工作。
我总是希望保持我的virtualenv
干净整洁,所以我经常发现自己在语义上将源代码组织到子模块/子文件夹中。所以每当我想要导入一些代码,类或其他文件夹中的任何东西时,我只需导入它。
想象一下,我virtualenv
中有以下结构:
├── bin
├── include
├── lib
└── src
├── foo.py
├── important_scripts
├── some_script.py
└── some_other_script.py
└── pip-selfcheck.json
现在,foo.py
中的某个地方,我想使用A()
中实现的名为some_script.py
的函数。显而易见的方法是向foo.py
添加一个简单的行 - 类似于from some_script import A
。当我从PyCharm运行并调试我的代码(在这种情况下为foo.py
)时,这样做非常有效。
与我上面描述的典型场景相反,我想从Terminal.app
做同样的事情。所以我将终端cd
启动到我的virtualenv
并激活它。然后,我所做的是,使用我bin
中virtualenv
文件夹下的Python可执行文件,我尝试运行foo.py
(至少这是我认为相当于右键单击并从PyCharm窗口运行foo.py
。不幸的是,我收到错误ModuleNotFoundError: No module named 'some_script'
。
我想我错过了一个简单的细节或其他东西。因为就像我说的那样,从PyCharm运行时它就像魔法一样。
无论如何,任何建议或帮助都将受到高度赞赏。提前谢谢。
答案 0 :(得分:0)
感谢所有回复和对可能解决方案的参考。在线研究时,我遇到了各种各样的实例,这些实例在导入模块和软件包时或多或少存在相同的问题。所以,这就是我刚刚解决它的方法:
important_scripts
目录下,我添加了一个名为__init__.py
的文件。这基本上只是告诉Python解释器这确实是一个Python包,而不是一个普通的子目录。在此__init__.py
中,我添加了
from important_scripts.some_script import A
然后在脚本中,我将从中导入函数A
,即foo.py
我包含以下几行:
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
基本上将virtualenv
附加到site-packages
。