文件的相对路径没有得到解决

时间:2017-09-15 10:24:47

标签: python python-3.x python-import

显然python接受与第一个被调用文件相关的每个相关输入。

我有以下文件结构

src
 |--myunittests.py
 |--subfolder1
      |--__init__.py
      |--printFileContent.py
      |--subfolder2
           |--__init__.py
           |--file

myunittests.py 将测试printFileContent中函数的行为:

from subfolder1.printFileContent import printFileContent
printFileContent()

printFileContent 打印子文件夹中包含的文件内容:

def printFileContent():
with open("./subfolder2/file") as file:
    for line in file:
        print(line)


if __name__ == "__main__":
    printFileContent()

文件只包含一些文字。

问题: 在子文件夹1中执行python3 printFileContent.py将正确输出文件内容。 但是,python3 myunittests.py会引发错误,无法找到该文件。

有没有办法解决这个问题? (有没有办法告诉python,以编程方式引用的文件应该是相对于它们使用的文件?

约束

  • 更改printFileContent.py中的内容不是一个选项(生成的文件)
  • printFileContent的这种调用在整个代码中的任意位置(单元测试文件调用一个对话框,在子目录2中调用printFileContent vv)

这种情况何时发生?file是在printFileContent.py中使用的图标时,从myunittests.py调用printFileContent.py

Sidequestion: 是否有适当的标题/要点词来解释/了解这种行为及其存在的问题?

1 个答案:

答案 0 :(得分:2)

如果您无法修改printFileContent.py,则可以保存当前目录,转到subfolder1目录,然后返回原始目录:

import subfolder1
import os

# Save current directory (absolute path)
cdir = os.path.abspath(os.path.curdir)

# Change directory, and call printFileContent
os.chdir(os.path.dirname(subfolder1.__file__))
subfolder1.printFileContent()

# Go back to the original directory
os.chdir(cdir)

如果您必须花费大量时间,可以将此行为设为可用with语句的类,以便它更易于使用且更强大(您赢得了#t; t忘记chdir返回):

import os

class TmpDirChanger:
  def __init__(self, tmpPath):
    self.currentDir = os.path.abspath(os.path.curdir)
    os.chdir(tmpPath)

  def __enter__(self): pass

  def __exit__(self, exc_type, exc_val, exc_tb):
    #change back to original dir
    os.chdir(self.currentDir)

with TmpDirChanger('path/to/some/dir'):
   do_something()

如果你可以修改printFileContent.py,那就不那么棘手了:

import os

def printFileContent():
    # This will give you path to subfolder1
    sfolder1 = os.path.dirname(__file__)

    # This will give you path to "file" in subfolder2
    name = os.path.join(sfolder1, 'subfolder2', 'file')

    with open(name) as file:
        for line in file:
            print(line)