【问题标题】:Python: file location when opened inside a class that is used in other modulesPython:在其他模块中使用的类中打开时的文件位置
【发布时间】:2020-04-14 18:29:58
【问题描述】:

假设我有一个像这样的文件结构:

test
    mammals
        Wolf.py
        wolfname.txt
    Zoo.py

Wolf.py 里面我有:

class Wolf:
    def __init__(self):
        with open('wolfname.txt', 'r') as fileobj:
            self.name = fileobj.read()
        print(self.name)

wolf = Wolf()

如果我从Wolf.py 内部调用它,它可以正常工作。如果我从Zoo.py 内部调用它,它会给出FFileNotFoundError: [Errno 2] No such file or directory: 'wolfname.txt' 错误。

在不解析绝对路径的情况下修复它的方法是什么?将来我可能还想使用其他新包中的Wolf 类。

我在 Zoo 中使用这个导入:

from mammals.Wolf import Wolf

wolf = Wolf()

编辑:我制作了这个 repl.it 以在线显示:https://repl.it/repls/DrearyGrizzledMicroscope

【问题讨论】:

  • 你尝试了什么相对路径?如果哺乳动物与 Zoo.py 位于同一文件夹中,则 Zoo.py 的路径应为哺乳动物/wolfname.txt
  • @PierreV。 import os os.path.dirname(os.path.abspath(__file__)) 会给我动物园的位置,不是吗? C://.../ProjectRoot/(将来我也想在 Linux 上运行这个程序)。但是,我必须硬编码if s.endsWith("ProjectRoot"): go to mammals?然后,如果我想在其他 10 个模块中使用 Wolf,每个模块都位于不同的文件夹中......那么呢?

标签: python python-3.x


【解决方案1】:

尝试将“wolf.py”文件或 Wolf 类名重命名为其他名称。

它可能会解决FileNotFoundError,因为名称相同。

否则:也许this answer 会帮助你?

【讨论】:

    【解决方案2】:

    取而代之的是;这样做:

    from mammals import Wolf
    

    那么你就可以通过Wolf.Wolf访问Wolf类了

    【讨论】:

    • 谢谢你,这成功了:import mammals 和后来的wolf = Wolf.Wolf()
    • @parsecer 我刚刚从当前目录中的包中访问了一个模块。更多信息请访问stackoverflow.com/a/7948504/9134528
    • 对不起,它不起作用...尝试了机器人 wolf = Wolf.Wolf()wolf = Wolf()
    • @parsecer from mammals.Wolf import Wolf 也可以。如果没有,那肯定是其他问题。
    • 包确实被访问了。如果我将print("inside Wolf") 设为Wolf.py 中的第一行,那么当从Zoo 运行时它会打印它,但是当它尝试wolf = Wolf() 时它会打印FileNotFoundError: [Errno 2] No such file or directory: 'wolfname.txt'
    【解决方案3】:

    我使用了这个:

    class Wolf:
        def __init__(self, path = ''):
            with open(path + 'wolfname.txt', 'r') as fileobj:
                self.name = fileobj.read()
            print(self.name)
    

    在动物园里:

    from mammals import Wolf
    
    print("inside Main.py")
    wolf = Wolf.Wolf("mammals/")
    

    因此在不同的文件中我可以传递不同的相对路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 2016-05-10
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多