В основному, коли у мене є файл python, наприклад:
python-code.py
і використовувати:
import (python-code)
інтерпретатор видає мені синтаксичну помилку.
Будь-які ідеї, як це виправити? Чи є тире незаконними у назвах файлів python?
В основному, коли у мене є файл python, наприклад:
python-code.py
і використовувати:
import (python-code)
інтерпретатор видає мені синтаксичну помилку.
Будь-які ідеї, як це виправити? Чи є тире незаконними у назвах файлів python?
Відповіді:
Ви повинні ознайомитись з PEP 8 , посібником зі стилю для Python Code:
Імена пакетів та модулів Модулі повинні мати короткі, малі імена. Підкреслення можна використовувати у назві модуля, якщо це покращує читабельність. Пакети Python також повинні мати короткі, малі імена, хоча використання підкреслення не рекомендується.
Оскільки назви модулів відображаються на імена файлів, а деякі файлові системи нечутливі до регістру і усікають довгі імена, важливо, щоб імена модулів були обрані досить короткими - це не буде проблемою для Unix, але це може бути проблема при перенесенні коду до старих версій Mac або Windows або DOS.
Іншими словами: перейменуйте свій файл :)
ops-scripts
і знаєте, що їх неможливо імпортувати, використовуючи звичайний підхід до простору імен. Або один сценарій може бути названий stop-website.py
для подібного ефекту. Будь-який із них все-таки можна імпортувати за допомогою runpy
та інших методів, звичайно, але це допомагає уникнути деяких поширених помилок.
cgi-bin
папці (роблячи на них unitttests), що є досить стандартним afaik. Якщо у вас є такий рідкісний випадок, обов'язково перейменуйте свій модуль, якщо у вас є контроль над ним.
Ще одна річ, яку слід зазначити у вашому коді, це те, що імпорт - це не функція. Так import(python-code)
має бути, import python-code
що, як уже згадувалося, трактується як "імпортувати пітон мінус-код", а не те, що ви задумали. Якщо вам дійсно потрібно імпортувати файл з тире в його імені, ви можете зробити наступне:
python_code = __import__('python-code')
Але, як також було сказано вище, це не дуже рекомендується. Ви повинні змінити ім'я файлу, якщо це щось, чим ви керуєте.
TLDR
Дефіси не є незаконними, але не слід їх використовувати з 3 причин:
Якщо вам обов'язково потрібно імпортувати ім'я файлу з тире, спеціальним синтаксисом є такий:
module_name = __import__('module-name')
Цікаво, чому нам потрібен спеціальний синтаксис?
Причина спеціального синтаксису полягає в тому, що коли ви пишете, import somename
ви створюєте об'єкт модуля з ідентифікатором somename
(щоб потім ви могли його використовувати, наприклад somename.funcname
). Звичайно, module-name
це не дійсний ідентифікатор, а отже, і спеціальний синтаксис, який дає дійсний.
Ви не розумієте, чому ім'я модуля не є дійсним ідентифікатором?
Не хвилюйтесь - я теж не став. Ось підказка , щоб допомогти вам: Подивіться на цю пітона лінії: x=var1-var2
. Ви бачите віднімання в правій частині завдання або ім'я змінної з тире?
PS
У моїй відповіді немає нічого оригінального, крім того, що я вважав найбільш релевантними фрагментами інформації з усіх інших відповідей в одному місці
psycopg2_binary = import_module('psycopg2-binary')
. Помилка => ModuleNotFoundError: No module named 'psycopg2-binary'
. Але psycopg2-binary
встановлено. Не маю ідеї, як її включити.
Проблема в тому, що python-code
це не ідентифікатор. Парсер розглядає це як python
мінус code
. Звичайно, це не буде робити те, що ви просите. Вам потрібно буде використовувати ім’я файлу, яке також є дійсним ідентифікатором python. Спробуйте замінити -
підкреслення.
Ви, ймовірно, можете імпортувати його через якийсь __import__
хак, але якщо ви ще не знаєте як, не слід. Імена модулів Python повинні бути дійсними іменами змінних ("ідентифікатори") - це означає, що якщо у вас є модуль foo_bar
, ви можете використовувати його зсередини Python ( print foo_bar
). Ви б не змогли зробити це із дивним іменем ( print foo-bar
-> синтаксичною помилкою).
На Python 3 використовуйте import_module :
from importlib import import_module
python_code = import_module('python-code')
Більш загально,
import_module('package.subpackage.module')
Хоча правильне іменування файлів є найкращим курсом, якщо python-code
це не під нашим контролем, використання хак __import__
краще, ніж копіювання, перейменування чи іншим чином возитися з кодом інших авторів. Однак я спробував, і це не вийшло, якщо я не перейменував файл, додавши .py
розширення. Подивившись на документ, щоб отримати спосіб опису .py
, я закінчив це:
import imp
try:
python_code_file = open("python-code")
python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
python_code_file.close()
Він створив новий файл python-codec
з першого запуску.