IOError:[Errno 2]包中没有这样的文件或目录

时间:2014-04-15 17:07:15

标签: python python-module

以下是我的 init .py,它位于pkg / settings

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(在设置中)作为脚本运行,则会找到该文件。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)