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
CenN
V2EX  ›  Python

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

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

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

    比如我的目录如下:

    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 文件
    CenN
        3
    CenN  
    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'
    ```
    CenN
        4
    CenN  
    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
    CenN
        7
    CenN  
    OP
       2020-09-28 09:48:57 +08:00
    @ruanimal 感谢,解决了。
    CenN
        8
    CenN  
    OP
       2020-09-28 09:49:55 +08:00
    @ruanimal
    用 from utils import process 解决了
    ruanimal
        9
    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
        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`
    CenN
        12
    CenN  
    OP
       2020-09-28 10:00:12 +08:00
    @BBCCBB 使用 .utils 无法在服务器上运行啊
    CenN
        13
    CenN  
    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 但是你这样在服务器实际跑脚本还是会错
    CenN
        15
    CenN  
    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
    CenN
        17
    CenN  
    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   ·   实用小工具   ·   5879 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:43 · PVG 09:43 · LAX 17:43 · JFK 20:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.