Basicamente, quando eu tenho um arquivo python como:
python-code.py
E use:
import (python-code)
o intérprete me dá erro de sintaxe.
Alguma idéia de como corrigi-lo? Os traços são ilegais nos nomes de arquivos python?
Basicamente, quando eu tenho um arquivo python como:
python-code.py
E use:
import (python-code)
o intérprete me dá erro de sintaxe.
Alguma idéia de como corrigi-lo? Os traços são ilegais nos nomes de arquivos python?
Respostas:
Você deve conferir o PEP 8 , o Guia de Estilo para Código Python:
Nomes de pacotes e módulos Os módulos devem ter nomes curtos e todos em minúsculas. Sublinhados podem ser usados no nome do módulo se melhorar a legibilidade. Os pacotes Python também devem ter nomes curtos, todos em minúsculas, embora o uso de sublinhados seja desencorajado.
Como os nomes dos módulos são mapeados para os nomes de arquivos e alguns sistemas de arquivos não diferenciam maiúsculas de minúsculas e truncam nomes longos, é importante que os nomes dos módulos sejam escolhidos para serem bem curtos - isso não será um problema no Unix, mas pode ser um problema. problema quando o código é transportado para versões mais antigas de Mac ou Windows ou DOS.
Em outras palavras: renomeie seu arquivo :)
ops-scripts
e saber que eles não podem ser importados usando uma abordagem de namespace de pacote normal. Ou um único script pode ser nomeado stop-website.py
para um efeito semelhante. Qualquer um desses ainda pode ser importado via runpy
e alguns outros métodos, é claro, mas isso ajuda a evitar alguns erros comuns.
cgi-bin
pasta (fazendo unitttests neles), o que é bastante comum. A menos que você tenha um caso raro como esse, renomeie seu módulo definitivamente se você tiver controle sobre ele.
Outra coisa a ser observada no seu código é que a importação não é uma função. Assim import(python-code)
deve ser o import python-code
que, como alguns já mencionaram, é interpretado como "importar python menos código", não o que você pretendia. Se você realmente precisar importar um arquivo com um traço no nome, faça o seguinte:
python_code = __import__('python-code')
Mas, como também mencionado acima, isso não é realmente recomendado. Você deve alterar o nome do arquivo se for algo que você controla.
TLDR
Os traços não são ilegais, mas você não deve usá-los por três motivos:
Se você definitivamente precisar importar um nome de arquivo com um traço, a sintaxe especial é esta:
module_name = __import__('module-name')
Curioso para saber por que precisamos de sintaxe especial?
O motivo da sintaxe especial é que, ao escrever, import somename
você cria um objeto de módulo com identificador somename
(para que você possa usá-lo posteriormente, por exemplo somename.funcname
). Obviamente, module-name
não é um identificador válido e, portanto, a sintaxe especial que fornece um identificador válido.
Você não entende por que module-name não é um identificador válido?
Não se preocupe - eu também não. Aqui vai uma dica para ajudá-lo: Olhe para esta linha python: x=var1-var2
. Você vê uma subtração no lado direito da atribuição ou um nome de variável com um traço?
PS
Nada original na minha resposta, exceto incluindo o que eu considerava as informações mais relevantes de todas as outras respostas em um só lugar
psycopg2_binary = import_module('psycopg2-binary')
. Erro => ModuleNotFoundError: No module named 'psycopg2-binary'
. Mas psycopg2-binary
está instalado. Não faço ideia de como incluí-lo.
O problema é que python-code
não é um identificador. O analisador vê isso como python
menos code
. Claro que isso não fará o que você está pedindo. Você precisará usar um nome de arquivo que também seja um identificador python válido. Tente substituir o -
por um sublinhado.
Você provavelmente poderia importá-lo através de algum __import__
hack, mas se você ainda não sabe, não deveria. Os nomes dos módulos do Python devem ser nomes de variáveis válidos ("identificadores") - ou seja, se você tiver um módulo foo_bar
, poderá usá-lo no Python ( print foo_bar
). Você não seria capaz de fazê-lo com um nome estranho ( print foo-bar
-> erro de sintaxe).
No Python 3, use import_module :
from importlib import import_module
python_code = import_module('python-code')
De forma geral,
import_module('package.subpackage.module')
Embora a nomeação adequada de arquivos seja o melhor caminho, se python-code
não estiver sob nosso controle, um uso de hack __import__
é melhor do que copiar, renomear ou mexer com o código de outros autores. No entanto, tentei e não funcionou, a menos que renomeie o arquivo adicionando a .py
extensão. Depois de examinar o documento para obter uma descrição .py
, acabei com o seguinte:
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()
Ele criou um novo arquivo python-codec
na primeira execução.