【问题标题】:How do I get path to python script, with proper case?如何在适当的情况下获取 python 脚本的路径?
【发布时间】:2014-02-06 01:55:01
【问题描述】:

我有一个脚本 B.py,它是从另一个脚本导入的,比如 A.py

如果我在 A 中导入 B,__file__ 魔法常量会将其路径中的一些大写字母转换为小写。

如果我直接运行 B 文件,__file__ 常量对于路径的大小写是正确的。

简而言之,就是这样。以下:

telplugins_path = os.path.dirname(os.path.realpath(__file__))

给我一​​条这样的路

C:\\Python\\lib\\site_packages\\mypackage

应该是什么时候

C:\\Python\\Lib\\site_packages\\mypackage

观察 'Lib' -> 'lib' 上的变化

任何人都知道如何在适当的情况下获得__file__ 的路径?在 Windows 上运行。

【问题讨论】:

  • 你为什么认为它给你的情况不正确?
  • 我不相信。这就是正在发生的事情。
  • 奇怪...我认为在 Windows 上,无论大小写如何,您都应该能够访问该路径。
  • @TotteKarlsson:Windows 文件系统不区分大小写。 Python 刚刚在sys.path 搜索列表中配置了C:\Python\lib\site_packages 路径。 这不是问题

标签: python windows python-2.7


【解决方案1】:

windows 文件系统不区分大小写。

Python 只是在 sys.path 搜索列表中配置了 C:\Python\lib\site_packages 路径,因此当您导入模块时,python 会使用小写版本构造文件路径。

这不是问题。 Windows 将继续使用小写版本的路径加载文件。

【讨论】:

  • 这对我来说是个问题。路径被传递给检查文件夹是否存在的较低级别的 C++ 模块。由于它有错误的情况,它回来说它不存在!我需要一个提供正确路径的解决方案,并提供正确的案例。您的答案没有提供,因此不是正确的答案。
  • @TotteKarlsson:那么那个 C++ 模块使用了错误的 API 来测试文件夹是否存在!
  • @TotteKarlsson:Python 有os.path.normcase() function,它会将路径小写,包括Python 的初始P,这可能会让你变得更糟。跨度>
  • @TotteKarlsson:对于 C++ 文件夹检查,请参阅 How do you check if a directory exists on Windows in C? 了解测试文件夹是否存在的正确方法。
  • 观察:问题是如何获得正确大小写的路径。我非常感谢有关其他编程技术的建议。然而,主要的问题是,如何获得正确案例的路径?
【解决方案2】:

在 Windows 上,win32 模块包含函数 GetLongPathName。它确实解决了上述问题。

也就是说,下面给出了一个大小写正确的路径:

aFile = win32api.GetLongPathName(__file__)
pathWithCorrectCase = os.path.split(aFile)[0]

但是,我想避免使用 win32 模块,因为它看起来并不完全“标准”。

【讨论】:

  • 它不适用于超过 8 个字符的目录/文件名部分
【解决方案3】:

通过标准库生成:

cased_path = glob.glob(re.sub(r'([^:])(?=[/\\]|$)', r'[\1]', __file__))[0]

【讨论】:

    【解决方案4】:

    您可以在 Windows 上进行某些调用,这些调用会因不正确的大小写而失败。还有像我这样的场景,这些调用被发送到区分大小写的机器。

    无论是什么情况,如果您需要在 Windows 上使用合适的外壳,这是我找到的最佳解决方案。

    对于单个文件,列出目录很容易,但是如果您有一个您不肯定的目录路径,则正确大小写:

    import win32com.client as com
    _dir = <your path>
    fso = com.Dispat("Scripting.FileSystemObject")
    folder = fso.GetFolder(_dir)
    path = folder.path
    

    这将返回正确大小写的路径。

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 2020-08-29
      • 2018-04-13
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2012-02-10
      相关资源
      最近更新 更多