当py_compile输入路径在Python中不同时,abspath会返回不同的结果吗?

时间:2018-02-12 04:28:57

标签: python linux

我想知道python脚本的abspath,然后是下面的步骤。

  1. 通过py_compile将其构建为字节代码。
  2. 执行它以检查abspath。
  3. 但是当我执行它时,我得到了 2个结果。我发现结果基于脚本路径后跟py_compile。

    这是我的脚本test.py:

    import os
    import inspect
    
    print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
    

    使用py_compile构建它,当我输入 test.py 的不同路径时得到2个结果:

    1.进入文件夹并使用脚本名称进行编译。然后执行chdir

    [~]cd /usr/local/bin/
    [/usr/local/bin/]python -m py_compile test.py
    [/usr/local/bin/]cd ~
    [~]python /usr/local/bin/test.pyc
    /home/UserXX
    

    2.在其他文件夹中,使用绝对脚本名称进行编译。

    [~]python -m py_compile /usr/local/bin/test.py
    [~]python /usr/local/bin/test.pyc
    /usr/local/bin
    

    怎么得到2个不同的结果?

1 个答案:

答案 0 :(得分:1)

当我们想要获取一个python文件的路径时,通常我们可以使用以下任何方法:

<强> 1

A)

import os
import inspect
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))).replace('\\', '/')

b)中

import os
import inspect
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])).replace('\\', '/')

<强> 2

A)

import os
import sys
print os.path.dirname(os.path.abspath(__file__)).replace('\\', '/')

b)中

import os
import sys
print os.path.dirname(os.path.abspath(sys.argv[0])).replace('\\', '/')

对于大多数情况,我们使用1就足够了,我们很少使用像2那样的检查,因为inspect可能更慢。

我们什么时候使用2?比如使用inspect来获取文件路径?

我记得的一个方案是execfile,当fileA.py execfile fileB.py在其程序中,fileA&amp; fileB不在同一个文件夹中。 (也许更多情况)

然后,如果我们在__file__中使用fileB.py,您会发现它的目录与fileA.py相同,因为这里的目录将是调用者的目录。 然后我们必须使用inspect来获取fileB.py的目录。

无论如何,对于您的情况,如果您的test.py位于调用图的顶部,建议您使用__file__,则更快,无需使用inspect。 有了这个,如果你使用-m py_compile,它就适合你。

最后,为什么检查不能使用-m py_compile?

不幸的是,我没有找到正式文件来解释这一点。 但假设您的test.py位于tt文件夹中,那么让我们cd ..; python -m py_compile tt/test.py,您将在test.pyc文件夹中获得tt

打开这个pyc文件,虽然你会看到一些不适合男人阅读的东西,你仍然可以找到一些线索: 一行是这样的: currentframe(^@^@^@^@(^@^@^@^@(^@^@^@^@s^G^@^@^@tt/a.pyt

您是否在pyc文件中看到文件夹名称tt? 如果您使用inspect.stack()进行测试,则会更清楚,如果您使用print inspect.stack()[0][1]-m py_compile将始终将您当前的编译文件夹保存在pyc文件中。 这直接意味着在py_compile的过程中,某些内容被修复为pyc文件。我称之为fix的内容使您可以在-m py_compile所在的文件夹中运行您的程序。

希望这可以给你一些线索和帮助;帮助你。