Estou tentando executar um módulo no console. A estrutura do meu diretório é esta:
Estou tentando executar o módulo p_03_using_bisection_search.py
, no problem_set_02
diretório usando:
$ python3 p_03_using_bisection_search.py
O código dentro p_03_using_bisection_search.py
é:
__author__ = 'm'
from .p_02_paying_debt_off_in_a_year import compute_balance_after
def compute_bounds(balance: float,
annual_interest_rate: float) -> (float, float):
# there is code here, but I have omitted it to save space
pass
def compute_lowest_payment(balance: float,
annual_interest_rate: float) -> float:
# there is code here, but I have omitted it to save space
pass
def main():
balance = eval(input('Enter the initial balance: '))
annual_interest_rate = eval(input('Enter the annual interest rate: '))
lowest_payment = compute_lowest_payment(balance, annual_interest_rate)
print('Lowest Payment: ' + str(lowest_payment))
if __name__ == '__main__':
main()
Estou importando uma função na p_02_paying_debt_off_in_a_year.py
qual o código é:
__author__ = 'm'
def compute_balance(balance: float,
fixed_payment: float,
annual_interest_rate: float) -> float:
# this is code that has been omitted
pass
def compute_balance_after(balance: float,
fixed_payment: float,
annual_interest_rate: float,
months: int=12) -> float:
# Omitted code
pass
def compute_fixed_monthly_payment(balance: float,
annual_interest_rate: float) -> float:
# omitted code
pass
def main():
balance = eval(input('Enter the initial balance: '))
annual_interest_rate = eval(
input('Enter the annual interest rate as a decimal: '))
lowest_payment = compute_fixed_monthly_payment(balance,
annual_interest_rate)
print('Lowest Payment: ' + str(lowest_payment))
if __name__ == '__main__':
main()
Eu estou recebendo o seguinte erro:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Não tenho ideia de como resolver esse problema. Tentei adicionar um __init__.py
arquivo, mas ele ainda não está funcionando.
python
module
python-3.6
python-import
lmiguelvargasf
fonte
fonte
eval(input...
provavelmente não é uma ótima idéia. Gostaria de analisá-lo em vez de abrir a oportunidade para execução arbitrária de código.eval(input(...
foi sugerida por 2to3. Eu fiz isso comigo hoje. feliz que eu não segui-lo de sugestões blindlingRespostas:
Simplesmente remova o ponto da importação relativa e faça:
fonte
__init__.py
?__init__.py
na mesma pasta), embora meu PyCharm (2018.2.4) marque isso como uma "Referência não resolvida" e não consiga concluir automaticamente a importação.from ..sibling_pkg.nephew import my_function
é válido para PyCharm, mas resulta emValueError: attempted relative import beyond top-level package
e MyPyCannot find module named '.sibling_pkg.nephew'
(observe um único "." No erro, não dois). No entanto,from sibling_pkg.nephew import my_function
funciona como pretendido, não possui um erro MyPy, mas resulta em um erro PyCharm.Eu tenho o mesmo problema que você. Acho que o problema é que você usou a importação relativa
in-package import
. Não há__init__.py
no seu diretório. Portanto, apenas importe como Moisés respondeu acima.O principal problema que eu acho é quando você importa com um ponto:
É equivalente a:
onde
__main__
se refere ao seu módulo atualp_03_using_bisection_search.py
.Resumidamente, o intérprete não conhece sua arquitetura de diretório.
Quando o intérprete entra
p_03.py
, o script é igual a:e
p_03_using_bisection_search
não contém nenhum módulo ou instância chamadap_02_paying_debt_off_in_a_year
.Então, eu vim com uma solução mais limpa sem alterar os objetos de valor do ambiente python (depois de pesquisar como as solicitações são feitas na importação relativa):
A arquitetura principal do diretório é:
main.py
setup.py
---
problem_set_02/
------
__init__.py
------
p01.py
------
p02.py
------
p03.py
Então escreva em
__init__.py
:Aqui
__main__
está__init__
, exatamente se refere ao móduloproblem_set_02
.Então vá para
main.py
:import problem_set_02
Você também pode escrever um
setup.py
para adicionar um módulo específico ao ambiente.fonte
Tente executá-lo como:
python3 -m p_03_using_bisection_search
fonte
Se você criou um diretório e subdiretório, siga as etapas abaixo e lembre-se de que todo diretório deve ter
__init__.py
para que ele seja reconhecido como um diretório.No seu script, inclua
import sys
esys.path
, você poderá ver todos os caminhos disponíveis para o Python. Você deve poder ver seu diretório de trabalho atual.Agora importe o subdiretório e o respectivo módulo que você deseja usar:
import subdir.subdir.modulename as abc
e agora você pode usar os métodos nesse módulo.Como exemplo, você pode ver nesta captura de tela Eu tenho um diretório pai e dois subdiretórios e, nos segundos subdiretórios, eu tenho o módulo
CommonFunction
. À direita, meu console mostra que após a execução desys.path
, posso ver meu diretório de trabalho.fonte
Remova o ponto e importe absolute_import no início do seu arquivo
fonte
Basta usar o nome da pasta principal na qual o arquivo .py está.
fonte