LINUX.ORG.RU

Как вы вообще разрабатываете на питоне?

 


0

3

Здравствуйте

Допустим, имеем такую структуру проекта

module1.py
pkg1/
    script.py

Сдержимое script.py:

import module1

Находясь в директории проекта выполняем:

$ python3 pkg1/script.py
Traceback (most recent call last):
  File "pkg1/script.py", line 1, in <module>
    import mylib
ImportError: No module named mylib

Я, конечно, извиняюсь за глупый вопрос, но как вообще писать код на этом?

★★★★★
Ответ на: комментарий от linuhs_user

Как это вообще мешает, лол?

А как запускать-то скрипты из поддиректорий в процессе разработки?

makoven ★★★★★
() автор топика

Как вы вообще разрабатываете на питоне?

Так же как и на других языках - сначала читаем документацию о том, что до этого ещё не делали или забыли. Потом добавляем пути в переменную sys.path

grem ★★★★★
()
Ответ на: комментарий от linuhs_user

А может даже и отключить это можно, без пересборки. Просто флаг такой при канпеляции видел.

linuhs_user
()

Если тебе для разработки/экспериментов, то юзай ipython, у него есть команда %run, она отработает как тебе хочется в это ситуации. Если для продакшена, то скрипты надо оформлять через setuptools.

https://setuptools.readthedocs.io/en/latest/setuptools.html#automatic-script-...

provaton ★★★★★
()
Ответ на: комментарий от grem

Манипуляции с sys.path редко нужны, и не рекомендовал бы я их.

provaton ★★★★★
()
Ответ на: комментарий от provaton

Попробую иначе сформулировать. В сабж-посте написал несклолько противоречиво.

Понятно, что в продакшене скрипт из поддиректории будет нормально отрабатывать если написать в нем import my_proj/mod1. my_proj будет лежать в системной директории (или в «системной» директории venv).

А как запускать такой скрипт в процессе разработки, из рабочей директории, не прибегая к PYTHONPATH и sys.path.append?

makoven ★★★★★
() автор топика
Ответ на: комментарий от linuhs_user

В питоне тоже есть относительные импорты. Но почему-то жестко критикуются местными

makoven ★★★★★
() автор топика

module1, pkg1, script

No module named mylib

Да ладно?

Во первых ты ищешь:

python3 -m pkg1.script

Во вторых, перестань насиловать себя и свали писать на пыхе.

anonymous
()
Ответ на: комментарий от linuhs_user

Плюсую. Все это одна и та же шняга под разным соусом.

А насчет сегфолта — в этом нет ничего необычного, это так же другой соус, более низкий уровень реагирования, тут — ядерный.

И как глубоко бы мы не опускались, например: превышение номинального уровня температуры логических элементов ТТЛ-логики может повлечь за собой дестабилизацию рабочей точки p-n перехода как минимум, однако, даже без «механического» охлаждения, есть уровень реагирования на терморезисторе, который, нагреваясь, понижает частоту тактового генератора, что приводит к охлаждению всех элементов — саморегуляция.

Но ты же не станешь говорить: Ффу, понижение частоты, сегфолт куда удобнее.

deep-purple ★★★★★
()
Ответ на: комментарий от makoven

А можешь и на пыхе. Это смотря что нужно. Если пых это умеет — почему нет? Слушать местных хейтеров не нужно. Нужно брать инструмент который работает и подходит для задачи и делать.

deep-purple ★★★★★
()
Ответ на: комментарий от makoven

Для затравки: у меня написан на пыхе и работает скрипт кастомной нормализации уровней и фейдинга регионов в ардоровских проектах. Оно лезет в xml файла проекта, находит источники и регионы, парсит бинарные данные в ваф файлах, находит пики, тишину, нормализует и отрезав тишину с начала и конца региона, фейдит его. И все работает и очень быстро.

deep-purple ★★★★★
()
Ответ на: комментарий от makoven

Логика в том, что надо правильно указать корень твоего проекта.

$ cat pkg1/script.py 
import sys
print(sys.path)
$ python3 -m pkg1.script
['', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/lib64/python3.6/site-packages', '/usr/lib/python3.6/site-packages']
$ python3 pkg1/script.py 
['/tmp/test/pkg1', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/lib64/python3.6/site-packages', '/usr/lib/python3.6/site-packages']

Свалил писать на пыхе

Без шуток. Я не понимаю, нафига ты себя мучаешь, если у тебя геморрой от питона.

anonymous
()
Ответ на: комментарий от anonymous

Я не понимаю, нафига ты себя мучаешь, если у тебя геморрой от питона

А я не понимаю как так вышло, что все вышеотписавшиеся не знали про -m. Предлагали менять sys.path или юзать ipython

Все валим писать на пыхе! :)

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 3)
Ответ на: комментарий от linuhs_user

Путина уважаю, а вот тебя, херои хренов (что с салом, что без такового) нет.

Windows, а точнее Microsoft тоже уважаю, хотя сам использую только Linux. Хоть кому-то удалось создать ОС с GUI пользоваться которыми можно без сильной головной боли.

anonymous
()
Ответ на: комментарий от anonymous

Хоть кому-то удалось создать ОС с GUI пользоваться которыми можно без сильной головной боли

Буквально вчера приводил в порядок десятку только что купленного леново. Выкарчеевывал блотварь, ждал «Почти готово» по пол часа, отключал слежение и обновление. Боже, какой же это был стресс.. Все губы себе искусал

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от makoven

Предлагали менять sys.path или юзать ipython

Извращенцы. Ты кстати скорее всего тоже. Точка входа программы должна лежать в корневой директории. -m нужен, если какая-то либа таки зачем-то включает в себя рабочую программу. Типа python3 -m random или python3 -m http.server.

anonymous
()
Ответ на: комментарий от anonymous

Бывает что вспомогательных скриптов скапливается кучка и хочется их в отдельный каталог

makoven ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Лол, даже не знаю какая часть твоего сообщения смешенее первая или вторая.) Ну можно же перефразировать, суть не в этом.

linuhs_user
()
Ответ на: комментарий от linuhs_user

«Что значит имя? Роза пахнет розой, Хоть розой назови ее, хоть нет.»

То есть модулем это не становится из-за названия.

grem ★★★★★
()
Ответ на: комментарий от anonymous

Точка входа программы должна лежать в корневой директории.

Пачку вспомогательных консольных утилит проекта удобно класть в какую-нибудь папочку tools/, чтобы сразу было понятно где их искать потом.

Norgat ★★★★★
()

И где у тебя в структуре проекта mylib? Как это вообще связано?

Добавь в шапку script.py

#!/usr/bin/env python3
# coding: utf8
Может полегчает.

Вниз можно так:

import sys
if(len(sys.argv) > 1):
	print("debug code below")
И отлаживай скрипт наздоровье прямо в нем самом. А когда он будет импортиться откуда то, то там уже не будет аргументов и отладочный код не сработает. Это конечно дилетантский путь, но если что-то не важное, можно и так отладить.

I-Love-Microsoft ★★★★★
()

Здравствуйте

Здравствуйте

но как вообще писать код на этом?

Никак. Пиши на фшарпе

anonymous
()

В руби работает вот такая конструкция:

require File.expand_path('../utils.rb',  __FILE__)

Попробуй найти что-то аналогичное для питона.

Novator ★★★★★
()

с удовольствием

/thread

Sahas ★★★★☆
()
Ответ на: комментарий от Novator

Ну вот я поискал вместо тебя.

Раз:

import sys
sys.path.append("..")  #Добавляем верхнюю папку в поиск
import module1
import module2

Два:

import sys
import os.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
import module1.py
import module2.py

Три:

from ..module1.py import module1
from ..module2.py import module2

Четыре:

from ..module1 import *
from ..module2 import *

Как-то так, но я не пробовал.

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от grem

То есть модулем это не становится из-за названия.

В питоне тоже те еще модули. Какие-то хаки над файловой системой, неймспейсов не завезли. Наколенные такие модули, как и все в этом бейсике.

bread
()
Ответ на: комментарий от linuhs_user

Потому, что это просто «вставка» содержимого одного файла в другой. Попробуй из твоего «модуля» добавить функции и константы выборочно, а не все содержащиеся в нём. Компилироваться опять же будет всё содержимое, а не то, что хочется использовать.

grem ★★★★★
()
Ответ на: комментарий от bread

В смысле не завезли? Или имеется ввиду что-то другое, отличное от переименования имени модуля для последующего использования?

grem ★★★★★
()
Ответ на: комментарий от bread

А, понял, это когда вместо sin всегда нужно писать math.sin.

Непривычно немного, но дело привычки. В тех же C++ есть противники использования using namespase по ряду причин.

grem ★★★★★
()
Ответ на: комментарий от bread

неймспейсов не завезли

«в линуксе нет ворда -> не в чем делать документы», что если вместо неймспейсов есть куча других, не менее удобных аналогов?

I-Love-Microsoft ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.