使用._pth时,脚本目录未包含在sys.path中

时间:2018-04-25 13:40:38

标签: python pth

我正在尝试解决与我编写的Python脚本中导入模块相关的奇怪问题。实现该模块的文件与主Python脚本位于同一目录中。

当我使用ActivePython时,Python脚本非常有效。但是,当我使用Embedded Distribution时,我收到以下错误。

ModuleNotFoundError: No module named 'pyWhich'

我已经跟踪了行为的差异,以及在嵌入式发布中设置sys.path veritable的方式。

在ActivePython中,我的脚本工作的环境,sys.path中的第一个条目是包含脚本的目录。在Embedded Distribution中,包含脚本的目录没有条目。

Embedded Distribution使用_pth文件来设置sys.path。我使用的是默认的._pth文件,为方便起见,我在下面列出了该文件。

python36.zip
.

# Uncomment to run site.main() automatically
#import site

我的问题是,我需要添加到我的_pth文件以告诉Python 放置包含我在sys.path中运行的任何脚本的目录,以便我的脚本可以使用嵌入式分发。 path configuration files上的文档似乎不包含此信息。

3 个答案:

答案 0 :(得分:0)

您是否尝试过sys.path.append(' C:/ documents / folder / blah ...') (正确的文件夹位置为c)

答案 1 :(得分:0)

我仍然希望有一个神奇的咒语,我可以添加到我的_pth文件中,说“请放入包含我在sys.path中运行的任何脚本的目录”,这样我就不必修改我的所有脚本了。但是,有可能没有这种神奇的咒语。

我发现以下神奇的咒语在添加到Python脚本时可以达到预期的效果。而且,与其他解决方案不同,您可以在野外找到它,这个解决方案可以在cx_Freeze和IDLE的环境中工作,也可以在基于简单的文件的解决方案不起作用的任何其他环境中工作。

import inspect
import os
import sys

# Add script directory to sys.path.
# This is complicated due to the fact that __file__ is not always defined.

def GetScriptFile():
    """Obtains the full path and file name of the Python script."""
    if hasattr(GetScriptFile, "file"):
        return GetScriptFile.file
    ret = ""
    try:
        # The easy way. Just use __file__.
        # Unfortunately, __file__ is not available when cx_freeze is used or in IDLE.
        ret = os.path.realpath(__file__)
    except NameError:
        # The hard way.
        if len(sys.argv) > 0 and len(sys.argv[0]) > 0 and os.path.isabs(sys.argv[0]):
            ret = os.path.realpath(sys.argv[0])
        else:
            ret = os.path.realpath(inspect.getfile(GetScriptFile))
            if not os.path.exists(ret):
                # If cx_freeze is used the value of the ret variable at this point is in
                # the following format: {PathToExeFile}\{NameOfPythonSourceFile}. This
                # makes it necessary to strip off the file name to get the correct path.
                ret = os.path.dirname(ret)
    GetScriptFile.file = ret
    return GetScriptFile.file

def GetScriptDirectory():
    """Obtains the path to the directory containing the script."""
    if hasattr(GetScriptDirectory, "dir"):
        return GetScriptDirectory.dir
    module_path = GetScriptFile()
    GetScriptDirectory.dir = os.path.dirname(module_path)
    return GetScriptDirectory.dir

sys.path.insert(0, GetScriptDirectory())

顺便说一句,如果您希望看到这一点,我已将其实施为Python Which project

答案 2 :(得分:0)

我的解决方案是删除此文件:

python39._pth

这允许Pip正常工作,也允许来自同一目录的import。 或者,您可以获取以下信息:

https://nuget.org/packages/python

点击“下载程序包”,就可以像提取Zip文件一样提取