我在终端中调用了一个python3脚本;我没有使用Python
前缀来运行它,因为我在脚本中添加了#!/usr/local/bin/python3
(我在OSX上从brew获得了python3)。你知道吗
有趣的是,如果我在terminal中运行脚本,我会得到一个导入错误,因为我的一个自定义模块没有找到。如果我在pycharm中运行相同的脚本,它可以正常工作。你知道吗
我假设Python启动并以相同的方式读取我用于模块的所有不同路径,包括pycharm和terminal,但情况似乎并非如此。如何设置脚本以独立于模块的路径找到模块?你知道吗
我可能也会在其他机器上运行相同的脚本,所以我想做好准备,从一开始就做正确的事情。你知道吗
编辑
我正在OSX上运行pycharm;Python3是通过Brew安装的,但符号链接位于/usr/local/bin中。
我的脚本是从主目录中的文件夹运行的,所以
/Users/tester/git/python_test_app/main/base/app_main.py
自定义模块位于主py脚本的同一文件夹中,但在上面一级:/Users/tester/git/python_test_app/main/pyutils.py
来自app_main.py
的import语句是
import main.pyutils as utilities
这是我在运行脚本时得到的堆栈跟踪:
Traceback (most recent call last):
File "main/base/app_main.py", line 13, in <module>
import main.pyutils as utilities
ModuleNotFoundError: No module named 'main'
编辑2和解决方案
多亏了这些答案,我才明白这个问题与Pycharm如何处理项目有关。基本上,它以某种方式保存了项目所在的路径;因此调用import将导致项目文件夹被解析,这就是为什么它在Pycharm中工作良好的原因。你知道吗
在Python中,除非PYTHONPATH
具有指向我的项目或我编写的其他模块的路径,否则它将无法找到这些模块,因此会引发错误。你知道吗
修正:
在我用来运行应用程序的主模块中,我确实检索了文件的路径;我知道它比我需要的模块低一级;因此我可以显式地将文件夹添加到当前的sys.path
。这将使我能够成功调用导入。你知道吗
import sys
current_dir = os.path.dirname(__file__)
sys.path.insert(0, , current_dir)
唯一的缺点是,我在项目中使用的每个文件和资源都必须通过完整路径直接引用;因此我必须在项目中的各个文件周围传递current_dir
。你知道吗
在PyCharm上,按绿色“RUN”箭头旁边的框,然后按编辑配置(见图)
在那里您将有
Working Directory
-该路径是PyCharm运行脚本的地方(没有错误)。你知道吗尝试从该路径内的终端运行它-这将解决您的导入错误。你知道吗
PyCharm具有项目解释器设置。验证这些与系统Python相同。转到:
<project name>
which python3
)或者,可能是您在PyCharm中声明了源根目录,而系统无法正确运行模块,因为它存在于您运行它的路径中(尤其是在包中)。您可以使用
-m
参数并从Python调用它来解决这个问题。你知道吗您还可以尝试从PyCharm内部的终端运行它,并在初始化shell会话之前查看它添加到路径中的内容(有时您也可以在运行配置中看到这一点)。如果您所指的模块不是通过pip/安装到Python路径中,而是加载到项目路径中,那么这可能是罪魁祸首。你知道吗
相关问题 更多 >
编程相关推荐