Estou experimentando usar a API C do CPython e gerenciar dependências (por exemplo, setuptools) via poetry.
Para compilar meu código, escrevi um Makefile parecido com isto:
PYTHON = poetry run python
build: setup.py ...some C extension files...
$(PYTHON) setup.py build_ext
$(PYTHON) setup.py build_ext -i
O problema é que quando vou executá-lo, recebo isto:
$ make
poetry run python setup.py build_ext
make: poetry: No such file or directory
make: *** [build] Error 1
Ainda mais estranho:
$ type poetry
poetry is /Users/rusty/.local/bin/poetry
$ which poetry
$ echo $?
1
Pensei nisso which
e type
retornaria exatamente os mesmos resultados.
Verifiquei meu $PATH
e ele contém o diretório ~/.local/bin
(não /Users/rusty/.local/bin
, literalmente, ~/.local/bin
caso isso ajude) (onde o pypoetry está instalado) duas vezes.
Estou no macOS 15.3.2.
Por favor, não me dê sugestões como "não use poesia".
EDIT:
Quando executo poetry
no meu terminal, funciona bem:
$ poetry --version
Poetry (version 2.0.1)
Além disso, ~/.local/bin/poetry
é um link simbólico para outro arquivo que pode ser lido e executado por todos.
Alguns shells possuem a funcionalidade de aplicar a expansão de til à interpretação de elementos do caminho de pesquisa executável. No entanto, isso não é fornecido pelas chamadas de sistema subjacentes e não é um comportamento especificado para o shell POSIX.
Aparentemente, você está contando com esse comportamento para executar
poetry
a partir da sua linha de comando. O fato de funcionar indica que seu shell padrão (provavelmente o Zsh) executa a expansão de til em elementos do caminho. No entanto,make
por padrão, ele usa/bin/sh
para executar linhas de receita. Isso normalmente resultará em um shell com comportamento muito próximo ao do shell POSIX. Normalmente, esse shell não executará a expansão de til em elementos do caminho. Esse shell não encontrará seupoetry
comando no seu caminho, e é isso que você parece estar observando.Algumas de suas opções são:
poetry
executável. (Talvez ele acabe em /usr/local/bin/poetry, por exemplo.)~
para${HOME}
should para resolver.SHELL
variável no seu makefile como um caminho completo para um shell diferente a ser usado para executar receitas. Por exemplo,SHELL = /bin/zsh
. Observe, no entanto, que isso pode produzir alterações de comportamento em outras linhas de receitas também.Elas estão ordenadas do mais para o menos recomendado, na minha opinião.