【问题标题】:Accounting for a changing path考虑变化的路径
【发布时间】:2010-09-22 03:18:06
【问题描述】:

关于another question,您如何解释可能发生变化的路径?例如,如果一个程序正在调用与该程序位于同一目录中的文件,您可以简单地使用 *nix 中的路径“.\foo.py”。但是,显然 Windows 喜欢硬编码路径,例如"C:\Python_project\foo.py"。

如果路径改变会发生什么?例如,文件可能不在 C: 驱动器上,而是在拇指驱动器或可以更改驱动器号的外部驱动器上。该文件可能仍与程序位于同一目录中,但与代码中的驱动器号不匹配。

我希望程序是跨平台的,但我希望我可能必须使用 os.name 或其他东西来确定要使用哪个路径代码块。

【问题讨论】:

    标签: python file path


    【解决方案1】:

    我通过使用 os.getcwd() 弄清楚了。我还学习了如何使用 os.path.join 根据操作系统自动确定正确的路径格式。代码如下:

    def openNewRecord(self, event): # wxGlade: CharSheet.<event_handler>
        """Create a new, blank record sheet."""
        path = os.getcwd()
        subprocess.Popen(os.path.join(path, "TW2K_char_rec_sheet.py"), shell=True).stdout
    

    它似乎正在工作。感谢您的想法。

    【讨论】:

    • 嗯...没必要。使用 os.path.join。它已经知道您的特定操作系统的“/”与“\”。
    • 当然,投我一票,因为我还在学习。我不知道 os.path.join;我很高兴我得到了一些有用的东西。有时我对这个网站感到非常厌倦。
    • 我不得不否决您的答案,因为它不正确。投票不是关于你,而是关于在这里寻找答案的其他人。如果他们发现错误的信息,那真的很糟糕。例如,您可以修正您的答案。然后我将不得不删除反对票,因为它更好。
    • 只是好奇你为什么使用子进程?代码运行时间过长会锁定你的 gui 吗?
    • @S.Lott-fixed @Sam Corder-我一直在使用 os.popen() 直到被推荐使用 subprocess 模块,因为它更好。
    【解决方案2】:

    简单回答:你根据环境算出绝对路径。

    您真正需要的是一些指示。您可以从标准库的不同位置收集到各种运行时和环境信息(当我想在 Windows 上部署应用程序时,它们肯定会帮助我)。

    所以,首先是一些一般性的事情:

    1. os.path - 具有大量跨平台路径操作的标准库模块。你最好的朋友。 “Follow the os.path”我曾经在一本书中读到。
    2. __file__ - 当前模块的位置。
    3. sys.executable - 正在运行的 Python 的位置。

    现在您可以从这三个来源中收集到您想要的任何东西。 os.path 中的函数将帮助您绕过树:

    • os.path.join('path1', 'path2') - 以跨平台方式加入路径段
    • os.path.expanduser('a_path') - 在用户的主目录中找到路径a_path
    • os.path.abspath('a_path') - 将相对路径转换为绝对路径
    • os.path.dirname('a_path') - 获取路径所在的目录
    • 还有很多...

    所以结合这个,例如:

    # script1.py
    # Get the path to the script2.py in the same directory
    import os
    this_script_path = os.path.abspath(__file__)
    this_dir_path = os.path.dirname(this_script_path)
    script2_path = os.path.join(this_dir_path, 'script2.py')
    print script2_path
    

    并运行它:

    ali@work:~/tmp$ python script1.py 
    /home/ali/tmp/script2.py
    

    现在,对于您的具体情况,您似乎对“工作目录”和“脚本所在的目录”的概念有些混淆。这些可以相同,但也可以不同。例如,“工作目录”可以更改,因此使用它的函数有时可能会找到他们正在寻找的东西,但有时却找不到。 subprocess.Popen 就是一个例子。

    如果你总是绝对传递路径,你将永远不会遇到工作目录问题。

    【讨论】:

      【解决方案3】:

      “调用文件...foo.py”是什么意思?

      1. 进口?如果是这样,则路径完全在您的程序之外。使用.c:\ 或在shell 级别设置PYTHONPATH 环境变量。例如,您可以编写 2 行 shell 脚本来设置环境变量并运行 Python。

        窗户

        SET PYTHONPATH=C:\path\to\library
        python myapp.py
        

        Linux

        export PYTHONPATH=./relative/path
        python myapp.py
        
      2. 执行文件?考虑使用导入。

      3. 读取和评估?考虑使用导入。

      如果 PYTHONPATH 太复杂,请将您的模块放在 Python lib/site-packages 目录中,默认情况下它会放在 PYTHONPATH 中。

      【讨论】:

        【解决方案4】:

        如果您的文件始终与您的程序位于同一目录中,则:

        def _isInProductionMode():
            """ returns True when running the exe, 
                False when running from a script, ie development mode.
            """
            return (hasattr(sys, "frozen") or # new py2exe
                   hasattr(sys, "importers") # old py2exe
                   or imp.is_frozen("__main__")) #tools/freeze
        
        def _getAppDir():
            """ returns the directory name of the script or the directory 
                name of the exe
            """
            if _isInProductionMode():
                return os.path.dirname(sys.executable)
            return os.path.dirname(__file__)
        

        应该可以。另外,我在自己的应用程序中使用了 py2exe,并没有使用其他 exe 转换应用程序对其进行测试。

        【讨论】:

          猜你喜欢
          • 2019-03-24
          • 1970-01-01
          • 2011-12-21
          • 2019-11-02
          • 1970-01-01
          • 2019-10-24
          • 2019-11-17
          • 2023-02-26
          • 1970-01-01
          相关资源
          最近更新 更多