【问题标题】:os.path.isfile fails when using sys.path.append使用 sys.path.append 时 os.path.isfile 失败
【发布时间】:2019-06-27 16:34:41
【问题描述】:

我有以下几点:

application/3rdPArtyApp/file.py
application/3rdPArtyApp/directory/someFile
application/MyApp/file.py

我想从 MyApp 访问来自 3rdPartyApp 的文件,所以我在 MyApp/file.py 中执行以下操作

sys.path.append('../3rdPArtyApp')

这工作正常,我现在可以通过导入文件和函数来访问它们。
但是,3rdPartyApp 中有一个文件试图访问文件夹 directory/someFile 中的文件。

它使用以下内容检查其文件是否在从 MyApp 调用时失败,但在从 3rdPartyApp 单独调用时不会失败。

os.path.isfile(file)

我假设如果从 MyApp 调用时失败,因为它期望它位于 MyApp 路径下。

我该如何解决这个问题?

【问题讨论】:

  • 是的,它失败了,因为它是一个相对路径,并且您当前的工作目录与 3rdPartyApp 预期的不同。如果您有权访问该应用程序,则可以将os.path.isfile(file) 更改为相对于__file__ 的路径。否则,除了运行将工作目录更改为 3rdPartyApp 文件夹之外,您无能为力,这(我猜)不是您想要的。
  • 另外:不要命名变量file,它是一个python关键字。
  • 很遗憾,我无法更改 3rdPartyApp 代码。当我使用其中的函数时,有没有办法可以将工作目录更改为 3rdPartyApp??
  • 是的。给我一秒钟。

标签: python-3.x path


【解决方案1】:

如果您无法更改库代码,我认为您不得不在每次调用之前更改工作目录。

因此我实现了这个类似函数的帮助类change_cwd。只需使用 with change_cwd('../3rdPArtyApp'): 包装对外部库的每个函数调用。

import os

class change_cwd:
    def __init__(self, path):
        self.path = os.path.abspath(path)
    def __enter__(self):
        self.old_cwd = os.getcwd()
        os.chdir(self.path)
    def __exit__(self, exc_type, exc_value, traceback):
        os.chdir(self.old_cwd)

print(os.getcwd())
with change_cwd('Downloads'):
    print(os.getcwd())
print(os.getcwd())
/home/<user>
/home/<user>/Downloads
/home/<user>

【讨论】:

  • 这是你的世界,我很高兴你让我生活在其中 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2021-09-03
  • 2011-05-11
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
相关资源
最近更新 更多