请问 Python 怎么导入同目录下的 py 文件?

2020-09-28 09:30:13 +08:00
 CenN

新手小白,一直没解决这个问题。

比如我的目录如下:

怎么在createData.py中导入utils.py呢?

2964 次点击
所在节点    Python
24 条回复
matrix67
2020-09-28 09:32:05 +08:00
pycharm 里面直接打函数,下面会有一条红色的线,alter+ enter
ruanimal
2020-09-28 09:32:57 +08:00
大哥看下书吧,了解下 “包”和“模块的概念”

=========

简单来说,在 preprocessing 文件夹,新建一个__init__.py 文件
CenN
2020-09-28 09:37:33 +08:00
@matrix67 Pycharm 写的是`from preprocessing.utils import xxx`,在 Pycharm 中是可以用的,但是我这个最终是放到服务器上的,在服务器上就提示错误。
```
Traceback (most recent call last):
File "createData.py", line 4, in <module>
from preprocessing.utils import process
ModuleNotFoundError: No module named 'preprocessing'
```
CenN
2020-09-28 09:38:42 +08:00
@ruanimal 我也是试了很多种方法才来问的,你这样不行。
ruanimal
2020-09-28 09:40:15 +08:00
ruanimal
2020-09-28 09:46:57 +08:00
@CenN 有几个点你得确认, 看文档很重要大哥
1. 程序的执行入口: 应该是 train.py
2. 程序的工作目录: 应该是项目根目录, 也就是 python train.py
3. import 的方式: from .utils import xxx 或者 from preprocessing.utils import xxx
4. __init__.py
CenN
2020-09-28 09:48:57 +08:00
@ruanimal 感谢,解决了。
CenN
2020-09-28 09:49:55 +08:00
@ruanimal
用 from utils import process 解决了
ruanimal
2020-09-28 09:50:05 +08:00
可以看看这两篇

http://ponder.work/2016/04/25/Python%E5%8C%85%E5%AF%BC%E5%85%A5/

http://ponder.work/2016/06/22/python%E5%8C%85%E5%AF%BC%E5%85%A5%E5%86%8D%E8%B0%88/
BBCCBB
2020-09-28 09:57:48 +08:00
好像是推荐用 from .utils import xxx 这种方式.


from utils import xxx 这种, 如果全局有 utils 模块, 就会有冲突, 导致错误.

你看看 python 的相对导入.
zone10
2020-09-28 09:58:44 +08:00
假设你的包结构是这样的:

```bash
/preprocessing
__init__.py
createData.py
utils.py
```

如果你在 `preprocessing` 目录内运行 `createData.py`, 那么不管是 `from preprossing.utils import xxx` 还是 `from .utils import xxx` 都是不能运行的, 只能在 `preprocessing` 目录外运行 `python preprocessing/createData.py`, 或者改成 `from utils import xxx`
CenN
2020-09-28 10:00:12 +08:00
@BBCCBB 使用 .utils 无法在服务器上运行啊
CenN
2020-09-28 10:08:34 +08:00
createData 是处理数据,train 是训练模型的。
我想在 Pycharm 上用小数据量调试看看程序有没有错,然后放到服务器上执行。
所以想要在两个地方都能运行。
用 from utils import xxx 导入
在 Pycharm 上将 preprocessing 设为 source root
这样两个地方都能运行了
ruanimal
2020-09-28 10:18:39 +08:00
@CenN 但是你这样在服务器实际跑脚本还是会错
CenN
2020-09-28 10:29:50 +08:00
@ruanimal 在 preprocessing 下运行 createData 没出错啊
no1xsyzy
2020-09-28 10:37:50 +08:00
你是 cd 进 preprocessing 直接运行 python createData.py 了吧……
不然库发现不可能发现 utils
CenN
2020-09-28 10:39:25 +08:00
@no1xsyzy python preprocessing/createData 也没问题
BBCCBB
2020-09-28 10:46:23 +08:00
有个 python -m 的命令. 看看能解决不.
dobest
2020-09-28 10:49:48 +08:00
还是一个 relative import 的问题,__name__ == '__main__' 时,是没有包信息的,所以用 .mypackage import XX 会出错,可以在目录外执行 python -m mytrain.createData 或加入路径信息 。
可以参考 SO 的这个问题

https://stackoverflow.com/questions/16981921/relative-imports-in-python-3
laike9m
2020-09-28 10:55:36 +08:00
取决于你是怎么调用和运行的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711126

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX