python - Pycharm 运行将当前工作目录添加到 PYTHONPATH 的代码
问题描述
试图弄清楚这一点,因为我从 Pycharm 和终端运行代码时存在不一致。
Pycharm 自动添加当前工作目录;所以如果我添加一个包含在我的 CWD 中的模块,它不在 Pythonpath 中,它就可以正常工作。
但是当从终端运行时,Python 确实会抱怨,因为我的导入语句引用了无法访问的模块,因为 CWD 没有添加到 PYTHONPATH (我确实验证了这个打印出变量的内容,同时从 Pycharm 和终端运行)。
所以此时我假设在我的启动代码中,我需要将当前目录添加到 Pythonpath,或者这不正确?我无法知道最终用户可能会将我的代码放在哪里;我只是假设包含我所有不同模块的整个目录位于特定位置。
更具体地说,这就是我所在的位置:
当我从 Pycharm 运行时,我的 CWD 是
/apps/myapp/logic/
,我在该目录中运行脚本cd
,然后调用脚本./myscript.py
该脚本将该
#!/usr/bin/python3
行作为第一行,而不是使用python3 -m myscript.py
- 我得到的错误是在加载与我的脚本 (
/apps/myapp/logic/
) 相同目录或上一层 (/apps/myapp/
) 的模块时;可悲的是,模块加载发生在我__main__
运行之前;所以我无法添加到sys.path
脚本运行的当前目录。 - 如果我只是从 Pycharm 运行脚本,所有这些问题都不会发生
解决方案
经过各种反复试验,感谢我从评论中获得的信息;我确实找到了两种解决问题的方法。
1)创建一个shell脚本或另一个python脚本,它正在添加当前目录(所有文件所在的位置),并且在这个文件中没有导入。然后脚本调用具有主要功能的脚本。
2) 在模块的顶部,在 import 之后sys
,添加添加路径的语句,这样当 import 尝试访问模块时,当前目录将被添加到 PATH 中并且可以访问。
看起来都不是很好,但这就是我能找到的解决问题的全部。很确定有一种更优雅的方式来做到这一点
推荐阅读
- java - 在 assertj 中使用ComparatorForType 似乎不适用于作为对象属性的对象属性
- c# - 来自 PLC 的 C# UDP 消息无法在 Unity3D 中接收,但在 Wireshark 中可见
- android - Android:按住/单击按钮时如何更改/删除按钮行程
- jsf - 在primefaces中显示数据表中的数据到inputText
- javascript - JQuery滑块导航点不起作用
- primefaces - 有没有办法在 Primefaces 数据表中重复标题?
- cython - Cython:管道异常到文件并显式中止
- c# - 如何知道 TTS 是否完成
- docker - docker swarm 中的标签 - 它是如何工作的?
- node.js - NodeJS: TypeError: Converting circular structure to JSON