首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
V2EX  ›  问与答

这个算不算 Python 的 BUG?顺便求解决方案。

  •  
  •   invite · 2015-03-11 20:24:35 +08:00 · 2182 次点击
    这是一个创建于 1708 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了个模块 a.py 在同一级目录下,有一个配置文件 a.conf

    然后a里面是这样读取的: os.path.dirname( os.path.realpath(file) ) + a.conf

    然后在另外一个目录里面,有一个 b.py 需要引用 a.py

    这个时候,我在 b.py 的目录里,建了一个软连接到 a.py

    一开始运行 b.py 没问题

    第二次运行 b.py 的时候,说配置文件读取不到了

    后来,删除了 b.pyc ,再次运行,还是可以

    但只要有 pyc文件以后,停掉运行就找不到配置问了,请问这个是不是 BUG 啊?

    py 和 pyc 结果没有一致性呐。

    顺便求解决方案:模块如何载入自己的配置文件。

    8 回复  |  直到 2015-03-12 06:33:53 +08:00
        1
    glasslion   2015-03-11 20:39:29 +08:00
    用软链接来做包管理, 脑洞太大
        2
    invite   2015-03-11 20:50:48 +08:00
    @glasslion 以前用软连接简化了N多操作,这次也想起来试试,结果一开始以为OK了,结果还是有点问题,现在网上搜了下,用 -B 来不让解析器生成 pyc 文件。
        3
    glasslion   2015-03-11 21:06:54 +08:00
    @invite  早晚还得出事
        4
    14   2015-03-11 21:16:21 +08:00
    1. 配置文件完全可以用Python写啊就像Django的settings.py,这样很方便导入,功能也强大无数倍
    2. 如果你要让a.py获取这个脚本所在的绝对目录,这样写os.path.split(os.path.realpath(__file__))[0]
    3. 软链接早晚出事+10086
        5
    invite   2015-03-11 21:51:44 +08:00
    os.path.split(os.path.realpath(__file__))[0] 这个跟我那个表达的意思,不是一个么?

    PS: 正文里 V2EX 自动把双下划线给变成粗体了。

    软连接,之前用的,说实话还真好用。
    特别各种应用部署升级的时候。超级方便。
    只是不知道为什么pyc文件跟py文件执行的语义不一样。
        6
    invite   2015-03-11 21:52:52 +08:00
    @14 导入配置文件,那不是得把文件都复制到另外一个目录里面去?
        7
    14   2015-03-11 22:03:48 +08:00 via Android
        8
    Sylv   2015-03-12 06:33:53 +08:00
    我想是因为第一次运行时: os.path.realpath(__file__) => 原目录的 a.py 的路径 a/a.py
    生成 pyc 后:os.path.realpath(__file__) => 新目录的 a.pyc 的路径 b/a.pyc
    所以就读取不到 a.conf 了
    这不算 Python 的 bug,是你用法不对
    实在要用软链接就把 a.conf 也链接过去
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4108 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 08:30 · PVG 16:30 · LAX 00:30 · JFK 03:30
    ♥ Do have faith in what you're doing.