请问 Python 怎么导入同目录下的 py 文件? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Gave2620
V2EX    Python

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

  •  
  •   Gave2620 2020-09-28 09:30:13 +08:00 3655 次点击
    这是一个创建于 1838 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    比如我的目录如下:

    xhuPDUZ

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

    24 条回复    2020-09-28 20:31:46 +08:00
    matrix67
        1
    matrix67  
       2020-09-28 09:32:05 +08:00
    pycharm 里面直接打函数,下面会有一条红色的线,alter+ enter
    ruanimal
        2
    ruanimal  
       2020-09-28 09:32:57 +08:00
    大哥看下书吧,了解下 “包”和“模块的概念”

    =========

    简单来说,在 preprocessing 文件夹,新建一个__init__.py 文件
    Gave2620
        3
    Gave2620  
    OP
       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'
    ```
    Gave2620
        4
    Gave2620  
    OP
       2020-09-28 09:38:42 +08:00
    @ruanimal 我也是试了很多种方法才来问的,你这样不行。
    ruanimal
        5
    ruanimal  
       2020-09-28 09:40:15 +08:00
    ruanimal
        6
    ruanimal  
       2020-09-28 09:46:57 +08:00   1
    @CenN 有几个点你得确认, 看文档很重要大哥
    1. 程序的执行入口: 应该是 train.py
    2. 程序的工作目录: 应该是项目根目录, 也就是 python train.py
    3. import 的方式: from .utils import xxx 或者 from preprocessing.utils import xxx
    4. __init__.py
    Gave2620
        7
    Gave2620  
    OP
       2020-09-28 09:48:57 +08:00
    @ruanimal 感谢,解决了。
    Gave2620
        8
    Gave2620  
    OP
       2020-09-28 09:49:55 +08:00
    @ruanimal
    用 from utils import process 解决了
    BBCCBB
        10
    BBCCBB  
       2020-09-28 09:57:48 +08:00   1
    好像是推荐用 from .utils import xxx 这种方式.


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

    你看看 python 的相对导入.
    zone10
        11
    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`
    Gave2620
        12
    Gave2620  
    OP
       2020-09-28 10:00:12 +08:00
    @BBCCBB 使用 .utils 无法在服务器上运行啊
    Gave2620
        13
    Gave2620  
    OP
       2020-09-28 10:08:34 +08:00
    createData 是处理数据,train 是训练模型的。
    我想在 Pycharm 上用小数据量调试看看程序有没有错,然后放到服务器上执行。
    所以想要在两个地方都能运行。
    用 from utils import xxx 导入
    在 Pycharm 上将 preprocessing 设为 source root
    这样两个地方都能运行了
    ruanimal
        14
    ruanimal  
       2020-09-28 10:18:39 +08:00
    @CenN 但是你这样在服务器实际跑脚本还是会错
    Gave2620
        15
    Gave2620  
    OP
       2020-09-28 10:29:50 +08:00
    @ruanimal 在 preprocessing 下运行 createData 没出错啊
    no1xsyzy
        16
    no1xsyzy  
       2020-09-28 10:37:50 +08:00
    你是 cd 进 preprocessing 直接运行 python createData.py 了吧……
    不然库发现不可能发现 utils
    Gave2620
        17
    Gave2620  
    OP
       2020-09-28 10:39:25 +08:00
    @no1xsyzy python preprocessing/createData 也没问题
    BBCCBB
        18
    BBCCBB  
       2020-09-28 10:46:23 +08:00
    有个 python -m 的命令. 看看能解决不.
    dobest
        19
    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
        20
    laike9m  
       2020-09-28 10:55:36 +08:00
    取决于你是怎么调用和运行的
    ruanimal
        21
    ruanimal  
       2020-09-28 10:56:26 +08:00
    @CenN 如果 train 文件 想用 preprocessing 里面的函数,就会出错
    XDy0
        22
    XDy0  
       2020-09-28 14:39:58 +08:00
    我前段时间刚开始用 python 也遇到了这个问题,后来在项目结构上面做了点手脚,自己起个文件夹叫 lib,包都装进去,引入的时候就是 from lib.xxxxxx 。但是还是不能很好地解决那种 lib 里面的模块需要调用环境的模块的
    imn1
        23
    imn1  
       2020-09-28 15:39:49 +08:00
    如果建了一个空的 __init__.py
    就用
    from . import 文件名
    from .文件名 import 类|函数

    没有 init 文件,就不需要句点
    import 文件名
    cgwh
        24
    cgwh  
       2020-09-28 20:31:46 +08:00 via Android
    import .xxxxx
    就行了啊!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1052 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 18:24 PVG 02:24 LAX 11:24 JFK 14:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86