- Python-сообщество
- Уведомления
- #1 Янв. 11, 2014 11:19:42
- Добавление директории в sys.path. Где ошибка
- #2 Янв. 11, 2014 11:47:21
- Добавление директории в sys.path. Где ошибка
- #3 Янв. 11, 2014 13:04:39
- Добавление директории в sys.path. Где ошибка
- #4 Янв. 12, 2014 08:14:30
- Добавление директории в sys.path. Где ошибка
- #5 Янв. 12, 2014 09:06:30
- Добавление директории в sys.path. Где ошибка
- sys.path.append не работает с Python 3.x
- sys.path.append doesn’t work with Python 3.x
- 1 Answer 1
- Модификация Python sys.path не работает
- Effect of using sys.path.insert(0, path) and sys.path(append) when loading modules
- 2 Answers 2
Python-сообщество
Уведомления
#1 Янв. 11, 2014 11:19:42
Добавление директории в sys.path. Где ошибка
Добрый день. Я только начал изучать Python поэтому, если что, прошу сильно не бить.
Пытаюсь разобраться с sys.path и добавить туда папку с именем “example”, расположенную в одном каталоге с рабочей папкой “my_function”. Делаю так:
#2 Янв. 11, 2014 11:47:21
Добавление директории в sys.path. Где ошибка
#3 Янв. 11, 2014 13:04:39
Добавление директории в sys.path. Где ошибка
#4 Янв. 12, 2014 08:14:30
Добавление директории в sys.path. Где ошибка
Singularity
… sys.path только питон файлов *.py которые можно только импортировать
Прикреплённый файлы:
#5 Янв. 12, 2014 09:06:30
Добавление директории в sys.path. Где ошибка
Van
Или не разобрался или это немного не то.
Архив ваш не читал но…
Все примитивно. Файлы бывают 3 типов — модули питона (*.py,*.pyc,*.pyo…) они грузятся процедурой import
исполняемые файлы — их для выполнения ищет операционная система, которую и просят их выполнить (subprocess.check_call(“some.exe”))
и все прочие с ними работа при помощи open и ее родственников.
Для поиска файлов важно какие функции вы используете (вы можете использовать open для a.py не взирая на тип).
1 import — для версии 3 и 2 поиск идет по разному. Грубо говоря поиск идет в sys.path и текущей директории (os.getcwd,os.chdir)
2 subprocess.check_call операционная система ищет в текущей директории или в директориях указанных в переменной окружения path. Из скрипта ее можно получить
3 open ищет файлы ТОЛЬКО в текущей директории.
Для любой из этих функций можно указать полный путь или путь относительно текущей директории.
Есть еще изощренный способ — в текущей директории понаделать символьных ссылок на нужные файлы.
Отредактировано doza_and (Янв. 12, 2014 09:07:39)
Источник
sys.path.append не работает с Python 3.x
У меня есть Blender 2.66a, который представляет собой приложение, которое предлагает API Python 3.3. В моей системе у меня есть установка Python 3.2 с несколькими модулями, которые я хочу использовать внутри Blender, я пробовал как
и эти команды не дают ошибок, даже если функция автозаполнения работает, а новые модули индексируются, поэтому я попытался
но это порождает следующую ошибку
и я не понимаю эту ошибку, потому что она не может загрузить модуль, который он там просит меня установить тот же модуль, потому что этот модуль не установлен (?).
Что может вызвать эту непонятную проблему?
модуль tkinter работает с гном-терминалом
Если я правильно понял, вы используете Python 3.3 из Blender, но попробуйте включить стандартную библиотеку 3.2. Это обязательно вызовет у вас проблемы, вы не должны этого делать. Найдите другой способ. Вероятно, Blender предлагает способ использовать стандартную библиотеку 3.3 (и 99% совместимую с 3.2). Конечно, сторонняя библиотека Pure-Python, конечно, может быть включена путем возиться с sys.path .
Конкретная проблема, которую вы сейчас видите, скорее всего вызвана разницей в версии. Как отмечают люди в комментариях, Python 3.3 не находит _tkinter расширения _tkinter . Хотя он присутствует (как это работает с Python 3.2), он, скорее всего, в файле.so с тегом ABI, который несовместим с Blender Python 3.3, поэтому он даже не будет смотреть на него (подобно module.txt не рассматривается для import module ). Это хорошая вещь. Модули расширения сильно зависят от версии, небольшие несоответствия ABI (например, между 3.2 и 3.3 или два 3.3, скомпилированные с различными параметрами) могут вызывать практически любую ошибку, от сбоев до утечек памяти до молчания данных или даже с чем-то совершенно другим,
Вы можете проверить, выполняется ли это через import _tkinter; print(_tkinter.__file__) import _tkinter; print(_tkinter.__file__) в оболочке 3.2. Кроме того, _tkinter может жить в другом каталоге целиком. Добавление этого каталога фактически не будет исправлять реальную проблему, описанную выше.
Источник
sys.path.append doesn’t work with Python 3.x
I have Blender 2.66a which is an application that offers Python 3.3 APIs, On my system I have an installation of Python 3.2 with several modules that I wish to use inside Blender, I tried both
and this commands gives no errors, infact even the autocomplete feature works and new modules are indexed, so i tried
but this generates the following error
and I don’t get the point of this error because it fails to load a module that it’s there asking me to install the same module because that module is not installed ( ? ).
What can cause this obscure problem ?
the tkinter module works from the gnome-terminal
1 Answer 1
If I got you right, you’re using Python 3.3 from Blender but try to include the 3.2 standard library. This is bound to give you a flurry of issues, you should not do that. Find another way. It’s likely that Blender offers a way to use the 3.3 standard library (and that’s 99% compatible with 3.2). Pure-Python third party library can, of course, be included by fiddling with sys.path .
The specific issue you’re seeing now is likely caused by the version difference. As people have pointed out in the comments, Python 3.3 doesn’t find the _tkinter extension module. Although it is present (as it works from Python 3.2), it is most likely in a .so file with an ABI tag that is incompatible with Blender’s Python 3.3, hence it won’t even look at it (much like a module.txt is not considered for import module ). This is a good thing. Extension modules are highly version-specific, slight ABI mismatches (such as between 3.2 and 3.3, or two 3.3 compiled with different options) can cause pretty much any kind of error, from crashes to memory leaks to silent data corruption or even something completely different.
You can verify whether this is the case via import _tkinter; print(_tkinter.__file__) in the 3.2 shell. Alternatively, _tkinter may live in a different directory entirely. Adding that directory won’t actually fix the real issue outlined above.
Источник
Модификация Python sys.path не работает
Я пытаюсь изменить sys.path в одном из моих файлов Python, чтобы иметь некоторые
определенные библиотеки в пути поиска модулей (это может быть не самый лучший способ
но…). Если я вставляю несколько путей в начало sys.path, мой script не учитывает эти пути для будущих импорта. Если я создаю целый новый список, содержащий те библиотеки, которые мне нужны, и присваиваем этот список sys.path, тогда эти импорт учитываются. Это правильное поведение? Я использую python 2.5.4. Может ли это быть что-то из моей среды, которая может привести к такому поведению?
Некоторые фрагменты кода:
Если я сделаю
это не работает. Он не учитывает пути.
Если я это сделаю
Вам действительно нужно опубликовать код, чтобы мы могли вам помочь. Однако я могу сделать обоснованное предположение. Вы говорите, что если вы создадите новый список и назначьте его sys.path, тогда он будет работать. Я предполагаю, что вы имеете в виду, что вы делаете что-то вроде этого
Но если вы вставляете пути в начале, это не сработает. Я предполагаю, что вы используете метод вставки, например
Если это так, это неверно. Это создало бы список, который выглядит как
Вместо этого вы должны сказать
который даст вам
Но это все догадки, пока вы не разместите свой код.
Пример обновления sys.path, взятого из здесь
Это сработало для меня.
Как вы вставляете дополнительные пути?
Изменение пути выполняется так же, как любой другой список в Python изменяется – хотя это звучит так, будто вы просто сбрасываете его, переставляя его.
У меня была аналогичная проблема при работе в iPython с модулями, которые распространяются по нескольким каталогам. В этом случае, чтобы заставить импорт работать, нужно убедиться, что module.__path__ модулей с распределенным __init__.py включает в себя все каталоги, где находится один из модулей __init__.py , а также убедиться, что правильный каталог находится в sys.path.
Например, у меня есть модуль с именем foo, который содержит модуль, называемый bar, который распространяется по нескольким каталогам:
В iPython я уже импортировал baz и baf и хотел импортировать quux.
from foo.bar import quux
Это дало ImportError, потому что carol не был в sys.path , но sys.path.append(‘carol’) не исправил ImportError.
Требуется сообщить модуль bar , что один из его __init__.py можно найти в ‘carol/foo/bar’.
Источник
Effect of using sys.path.insert(0, path) and sys.path(append) when loading modules
I was recently having a problem with a python ImportError, where the module was found when running on my local computer but not found on the CI server. I solved this problem by swapping sys.path.append(path) in my script with sys.path.insert(0, path) where path is the string module location.
Since this is my module and not an installed package (related question), why does the order of paths fix this problem?
2 Answers 2
I’m quite a beginner in Python and I found the answer of Anand was very good but quite complicated to me, so I try to reformulate :
1) insert and append methods are not specific to sys.path and as in other languages they add an item into a list or array and :
* append(item) add item to the end of the list,
* insert(n, item) inserts the item at the nth position in the list ( 0 at the beginning, 1 after the first element, etc . ).
2) As Anand said, python search the import files in each directory of the path in the order of the path, so :
* If you have no file name collisions, the order of the path has no impact,
* If you look after a function already defined in the path and you use append to add your path, you will not get your function but the predefined one.
But I think that it is better to use append and not insert to not overload the standard behaviour of Python, and use non-ambiguous names for your files and methods.
Because python checks in the directories in sequential order starting at the first directory in sys.path list, till it find the .py file it was looking for.
Ideally, the current directory or the directory of the script is the first always the first element in the list, unless you modify it, like you did. From documentation —
As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.
So, most probably, you had a .py file with the same name as the module you were trying to import from, in the current directory (where the script was being run from).
Источник