【问题标题】:import python file [duplicate]导入python文件[重复]
【发布时间】:2011-05-23 21:09:14
【问题描述】:

可能重复:
Python package structure

你好, 我正在寻找一个 python 文件,该文件位于我的主文件根目录下的子目录中。例如

import ../library/utils.py

当我将它放入我的代码并运行它时,我得到一个编译错误。

有没有办法从主文件根目录下面包含文件,还是必须在根目录的子目录中?

感谢您的帮助。

【问题讨论】:

    标签: python python-2.7 python-import


    【解决方案1】:

    您不导入文件,而是导入模块。相应地修改sys.path,并做import utils,例如

    import sys
    sys.path.append('../library')
    import utils
    

    【讨论】:

    • 这将起作用,但不是以独立于位置的方式。
    • 为什么我应该只导入模块。例如,我有一个名为 credentials.py 的文件,其中包含我在很多脚本中需要的数据库凭据。所有脚本都使用导入凭据并访问然后在凭据.py 中定义的变量。这是不好的做法吗?会有什么建议?
    • @Hyperboreus - 采用这种方式 - 您导入的任何文件都是模块。关于练习,嗯..我也这样做:)
    • @Hyperboreus:我的意思是虽然模块可以从文件中加载,但导入机制比这更灵活(这就是为什么你使用带有import的模块名,而不是文件名) .
    • @Hyperboreus:这不是关于你应该做什么(这是另一个主题),但在 python 中,import 语句导入一个 module 与像 C 这样的语言相反,它包含一个文件.如果你有一些文件credentials.py,那么python唯一允许的就是导入credentials模块(知道它是否由credentials.py文件实现是无关紧要的)。
    【解决方案2】:
    import sys, os
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'library')))
    
    import utils
    

    这将修改包含要搜索文件的目录的 sys.path 变量。即使您将其运行为:

    ,它也会确保它能够正确找到它:
    $ python the_file.py
    $ python ../the_file.py
    $ python /somewhere/over/the_file.py
    

    这适用于正在开发、测试和培训的东西。安装的文件不需要这样的结构。

    【讨论】:

    • 这比 Cat 的回答稍微不正确,因为它尝试计算正确的绝对路径以添加到 sys.path,而不是假设进程工作目录与 Python 包的基础相同。但是,它仍然不正确,因为__file__ 可能无法反映源的实际安装位​​置(字节码通常构建在临时构建目录中,然后重新定位到安装目录)。对于鸡蛋和 zip 文件,它也失败了。
    • 哇,那么您的 100% 解决方案一定很酷!
    • 只需使用带有一些 zc.recipe.egg 的构建来准备正确的路径 :-) ... 可能有点矫枉过正。
    猜你喜欢
    • 2019-02-23
    • 2019-12-03
    • 2020-08-18
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多