显然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,以编程方式引用的文件应该是相对于它们使用的文件?
约束
这种情况何时发生?
当file
是在printFileContent.py
中使用的图标时,从myunittests.py调用printFileContent.py
Sidequestion: 是否有适当的标题/要点词来解释/了解这种行为及其存在的问题?
答案 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)