IOError: [Errno 2] 找不到文件或目录 / 在包中

2 投票
2 回答
3565 浏览
提问于 2025-04-18 02:50

下面是我在 pkg/settings 文件夹下的 __init__.py 文件。

import yaml
import os

def Keypairs():
    print os.path.dirname(os.path.realpath(__file__))
    with open('keypairs.yaml') as f:
        return yaml.load(f)

我运行这个包的命令是:python -m pkg.test.first,这个命令里面有一个相对导入:

from ..settings    import Keypairs    
print Keypairs()

但是我遇到了这个问题:

IOError: [Errno 2] No such file or directory: 'keypairs.yaml'

尽管文件结构是这样的:

pkg/
  __init__.py
  settings/
    __init__.py
    keypairs.yaml
  test/
    __init__.py
    first.py

我到底在目录上搞错了什么呢?

如果我直接把 __init__.py(在 settings 文件夹里)当作脚本运行,它能找到这个文件。

2 个回答

1

看起来因为我把这个文件当作一个包来运行,所以它把包所在的文件夹当作父目录。

所以你需要传递

basepath = os.path.dirname(__file__)
keypairs = os.path.abspath(os.path.join(basepath, "keypairs.yaml"))
with open(keypairs,'r') as f:
    return yaml.load(f)

或者如果你想用绝对路径的话:

with open("pkg/settings/keypairs.yaml",'r') as f:

还有一种最干净的方式,感谢@yorodm的帮助

with open(os.path.join(os.path.dirname(__file__),'keypairs.yaml')) as f:
    return yaml.load(f)
0

编辑过

你打开文件的目录不对,导入一个模块并不会改变你的工作目录。你应该这样做:

 import yaml 
 import os

 def Keypairs():
   print os.path.dirname(os.path.realpath(__file__))

   with open(os.path.join(os.path.dirpath(__file__),'keypairs.yaml')) as f:
     return yaml.load(f)

撰写回答