Каталог скриптов, не включенный в sys.path, когда используется ._pth - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь решить странную проблему, связанную с импортом модулей в написанном мной скрипте Python. Файл, реализующий модуль, находится в том же каталоге, что и основной скрипт Python.

Скрипт Python отлично работает, когда я использую ActivePython. Однако, когда я использую Embedded Distribution , я получаю следующую ошибку.

ModuleNotFoundError: No module named 'pyWhich'

Я проследил разницу в поведении до способа установки истинного sys.path во встроенном дистрибутиве.

В ActivePython, среде, в которой работает мой скрипт, первая запись в sys.path - это каталог, содержащий скрипт. Во встроенном дистрибутиве нет записи для каталога, содержащего скрипт.

Встроенный дистрибутив использует файл _pth для установки sys.path. Я использую файл по умолчанию ._pth, который я включил ниже для вашего удобства.

python36.zip
.

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

У меня вопрос: какое магическое заклинание мне нужно добавить в мой _pth-файл, чтобы сообщить Python , пожалуйста поместите каталог, содержащий любой скрипт, который я запускаю в sys.path, чтобы мои скрипты работали со встроенным распространение. Документация по файлам конфигурации пути не содержит этой информации.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Я все еще надеюсь на магическое заклинание, которое я могу добавить в свой _pth файл, который говорит: «Пожалуйста, поместите каталог, содержащий любой скрипт, который я запускаю, в sys.path», чтобы мне не пришлось изменять все мои скрипты.Однако возможно, что такого магического заклинания не существует.

Я обнаружил, что следующее магическое заклинание, когда оно добавлено в скрипт Python, достигает желаемых результатов.И, в отличие от других решений, которые вы можете найти там в дикой природе, это будет работать в контексте cx_Freeze и IDLE и в любом другом контексте, в котором простые решения на основе file не будут работать.

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. Какой проект .

0 голосов
/ 25 апреля 2018

Вы пробовали sys.path.append ('C: / documents / folder / blah ...') (с правильным расположением папки ofc)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...