Doom-emacs: Masalah dengan menyetel versi pyenv secara otomatis (mengembangkan cabang)

Dibuat pada 1 Jul 2018  ·  33Komentar  ·  Sumber: hlissner/doom-emacs

Pertama, saya sangat menikmati Doom, jadi terima kasih atas semua pekerjaan Anda!

Perilaku yang diamati

Ketika saya memuat proyek yang memiliki kumpulan versi python tertentu menggunakan file .python-version di direktori proyek, versi python itu tidak dimuat seperti yang diharapkan. Modeline melaporkan "Python 2.7.14" bukan "Python 3.6.5".

Jika saya mengeksekusi :!pyenv version dalam emacs, ia melaporkan:

"2.7.14 (ditetapkan oleh variabel lingkungan PYENV_VERSION)"

Ini menunjukkan kepada saya bahwa itu entah bagaimana mendapatkan versi pyenv shell , tetapi saya belum menetapkannya. Menggunakan perintah ini di terminal akan mengembalikan "pyenv: tidak ada versi khusus shell yang dikonfigurasi". echo $PYENV_VERSION kosong.

pyenv version di terminal di luar laporan emacs (dengan benar) 3.6.5. Selain itu, saya memiliki pyenv global yang disetel ke 3.6.5, jadi ini harus dimuat kecuali saya berada di direktori tempat saya menentukan versi yang berbeda.

Perilaku yang diharapkan

Modeline harus melaporkan versi pyenv yang benar (baik versi yang disetel di pyenv global, atau versi khusus direktori dari file versi .python.

Langkah-langkah untuk mereproduksi

  1. Buka file python di Doom
  2. Modeline melaporkan versi pyenv yang salah
  3. Mx run-python menghasilkan kesalahan sebagai konsekuensinya, karena saya tidak menginstal iPython untuk 2.7.14 python.

Sistem Informasi


Klik untuk memperluas

- OS: darwin (x86_64-apple-darwin17.5.0)
- Emacs: 26.1 (Jun 12, 2018)
- Doom: 2.0.9 (develop 5e9f74c269706fd840e76523555ed648a12bdab1)
- Graphic display: t (daemon: nil)
- System features: JPEG RSVG IMAGEMAGICK NOTIFY ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS MODULES THREADS LCMS2
- Details:
  ```elisp
  elc count: 0
  uname -a:  Darwin serenity 17.6.0 Darwin Kernel Version 17.6.0: Tue May  8 15:22:16 PDT 2018; root:xnu-4570.61.1~1/RELEASE_X86_64 x86_64
  modules:   (:feature (evil +everywhere) file-templates (lookup +devdocs +docsets) snippets spellcheck (syntax-checker +childframe) workspaces :completion (ivy +fuzzy +childframe) :ui doom-dashboard doom-modeline doom-quit evil-goggles hl-todo nav-flash neotree (popup +all +defaults) vc-gutter vi-tilde-fringe window-select :editor :emacs ediff electric eshell imenu term vc :tools ein macos magit :lang emacs-lisp latex markdown (org +attach +babel +capture +export +present +ipython) (python +conda) sh web :config)
  packages:  n/a
  exec-path: (/usr/local/bin/ /usr/bin/ /bin/ /usr/sbin/ /sbin/ /opt/X11/bin/ /Library/TeX/texbin/ /usr/local/Cellar/emacs-plus/26.1/libexec/emacs/26.1/x86_64-apple-darwin17.5.0/)
  ```

Terima kasih!

:lang python bug env

Komentar yang paling membantu

Saya menduga Anda perlu menambahkan ~ / .pyenv / shims ke PATH Anda dalam file ~ / .profile Anda.

export PATH=~/.pyenv/shims:$PATH

Semua 33 komentar

Jika Anda menjalankan Emacs di MacOS, dan jika Anda meluncurkan Emacs dari Dock, Anda mungkin mengalami masalah yang sama persis dengan yang saya alami. MacOS melakukan beberapa hal aneh pada variabel lingkungan saat Anda meluncurkan dari Dock atau LaunchPad, sehingga $ PATH tidak disinkronkan dengan shell asli Anda.

Solusi saya saat ini adalah membuat skrip di bawah / usr / local / bin, yang isinya adalah:

#!/usr/bin/env zsh
(/usr/local/Cellar/emacs-mac/emacs-26.1-z-mac-7.1/Emacs.app/Contents/MacOS/Emacs "$@") &

Anda perlu memperbarui skrip ini sesuai dengan pengaturan Anda, seperti shell yang Anda gunakan dan di mana Anda menginstal emacs. Tetapi cara ini umumnya menyelesaikan masalah $ PATH.

Saya menjalankan Emacs dari Alfred, secara efektif sama dengan meluncurkan dari Dock atau LaunchPad. Namun, menggunakan skrip yang Anda sediakan meluncurkan Emacs dengan baik, tetapi sayangnya tidak menyelesaikan masalah pyenv yang saya miliki. Saya hanya mendapatkan hasil yang sama dengan yang saya dapatkan di atas. Dalam emacs, (getenv PATH) memberi saya jalur yang sama dengan yang saya miliki di shell (termasuk jalur shims pyenv). Agak membingungkan!

@bsag Dapatkah Anda memberi tahu saya jika variabel +python-current-version berisi versi yang benar?

Tidak, ini mengembalikan:
"2.7.14"

Di direktori itu, ada file .python_version yang menentukan "photo2hugo", dan menjalankan python --version di direktori itu di terminal mengembalikan "Python 3.6.5".

pyenv global juga 3.6.5

Saya memiliki 2.7.14 sebagai salah satu versi python yang tersedia untuk pyenv, tetapi sejauh yang saya tahu itu tidak diaktifkan di lingkungan saya mana pun.

Terima kasih telah menyelidiki!

Hai, saya juga bertemu masalah yang sama.

Dan + python-current-version mengembalikan nol sementara + python-pyenv-versi mengembalikan 3.6.5.

Perhatikan bahwa ini bekerja dengan baik di bawah emacs --nw tetapi tidak berjalan dengan baik saat meluncurkan GUI di bawah OSX 10.13

Saya telah mendorong kemungkinan perbaikan untuk ini. Selama direktori shims pyenv ada di PATH (dan exec-path , dengan ekstensi), +python-current-version harus berisi versi saat ini. Harap perbarui dan beri tahu saya jika memang demikian.

Hai hlissner, terima kasih atas pembaruannya.

Setelah memperbarui, itu masih tidak berfungsi seperti yang diharapkan, dan saya sudah

  1. + kembali versi python-saat ini

Nilainya adalah "2.7.15" (sementara + python-pyenv-version mengembalikan 3.6.5)
Lokal di buffer bigpydir.py (file saya); nilai global adalah nol

Secara otomatis menjadi buffer-local saat disetel

2.> echo $ PATH
/Users/yanbo/.pyenv/shims:/Users/yanbo/.jenv/shims:/Users/yanbo/.jenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/ usr / bin: / sbin: / bin: / usr / games: / usr / local / games: /Users/yanbo/.composer/vendor/bin: /Users/yanbo/.rvm/bin

Hai @hlissner , saya khawatir saya memiliki pengalaman yang sama dengan @Yanbo. Itu masih tidak berfungsi, dan yang lebih aneh lagi, saya sekarang sepertinya tidak memiliki + python-versi saat ini yang tersedia untuk Mx. Saya mencoba mengomentari baris python di init.el saya untuk menghapus dan menginstalnya kembali, untuk memastikan bahwa ada sesuatu yang tidak beres, tetapi saya masih tidak memiliki + python-current-version.

Untuk apa nilainya, saya juga mencoba menginstal pyenv-mode . Itu berfungsi seperti yang diharapkan: Saya dapat menggunakan Mx pyenv-mode-set untuk memilih dari versi pyenv python saya yang tersedia, dan cuplikan di bagian bawah readme untuk secara otomatis beralih ke pyenv env yang dinamai sama dengan proyek saya saat beralih ke proyek . Teks modeline tetap di Python 2.7.14, tetapi versi python yang benar dimuat saat menggunakan run-python, menjalankan REPL, dan saat Anda menanyakan versi pyenv dengan :!pyenv version .

Hmm, penasaran. Sekarang bekerja ... semacam itu.

Sebagai bagian dari mencoba men-debug beberapa masalah yang saya alami saat menjalankan R REPL melalui ESS ketika saya meluncurkan Emacs sebagai emacsclient, saya menambahkan baris ini ke .config.el saya:

(require 'exec-path-from-shell)
(exec-path-from-shell-initialize)

Itu berarti ESS dapat menemukan biner R saya, dan ketika saya kebetulan meluncurkan ruang kerja berbasis python, saya menemukan bahwa modeline sekarang melaporkan versi pyenv yang benar, dan Python REPL diluncurkan dengan benar. Namun penyelesaian otomatis tidak berfungsi, dan saya sering mendapatkan pesan kesalahan berikut:

Penyelesaian asli shell dinonaktifkan, menggunakan fallback
Kesalahan server: TypeError ("__ init __ () mendapat argumen kata kunci yang tidak terduga 'lingkungan'",)

Mungkin ada hubungannya dengan server bahasa, tetapi saya memiliki server-bahasa-python (v 0.17.1) yang diinstal di lingkungan virtual itu. Bagaimanapun, kemajuan saya pikir!

@bsag Pernahkah Anda menggunakan Emacs melalui daemon selama ini? Itu akan menjelaskan banyak hal, karena Doom menggunakan exec-path-from-shell , tetapi hanya dalam sesi GUI (bukan sesi daemon atau terminal, karena itu diharapkan telah dimulai dari lingkungan shell yang waras, yang, jika dipikir-pikir, tidak true untuk daemon di MacOS, kecuali jika dijalankan secara manual melalui emacs --daemon , bukan melalui launchctl atau brew services ).

_Tanpa_ baris exec-path-from-shell itu di konfigurasi Anda, dan jika Anda menjalankan daemon melalui emacs --daemon , apakah versi pyenv yang benar terdeteksi?

Saya baru saja mencoba saran Anda, dan tidak melaporkan pyenv yang benar saat dijalankan dari emacs --daemon.

Bagaimanapun, menjalankannya BUKAN melalui GUI adalah hal yang baru-baru ini saya coba (seharusnya saya jelaskan). Ketika saya awalnya melaporkannya, saya menjalankan langsung dari GUI (yaitu meluncurkan Emacs.app yang menginstal homebrew). Ini menunjukkan versi pyenv yang salah.

Kemudian saya mengotak-atik akhir pekan ini, dan memutuskan untuk mencoba menggunakan layanan launchctl yang disediakan oleh brew. Seperti yang Anda tunjukkan, itu tidak mengatur jalur dengan benar, jadi saya menemukan saya harus menggunakan garis-garis itu untuk membuatnya mengenali jalur, yang tampaknya (sebagian, setidaknya, meskipun sesuatu tentang lingkungan rusak dengan cara tertentu) Saya tidak mengerti).

Saya mengalami masalah yang sama. +1

Saya telah membuat kemajuan dalam modul lang / python; dukungan pyenv, pyvenv dan pipenv sudah tersedia dan dukungan conda ditingkatkan. Bagaimana info versi / env ditampilkan di baris mode ditulis ulang. Dan Doom telah mengubah filosofi untuk berinteraksi dengan lingkungan pyenv / pyvenv / conda Anda.

Cara lama: Doom akan mencoba menebak env yang benar setiap kali Anda memulai mode python.

Cara baru: peralihan env / versi sekarang dilakukan secara manual dan global, melalui M-x dan perintah yang disediakan oleh plugin pyenv-mode, pyvenv dan conda Emacs:

  • pyenv: pyenv-mode-set dan pyenv-mode-unset
  • pyvenv: pyvenv-activate dan pyvenv-deactivate
  • conda: conda-env-activate dan conda-env-deactivate
  • pipenv: pipenv-activate dan pipenv-deactivate (EDIT)

Mengapa berubah: mencoba "menebak" env yang benar rawan kesalahan. Plugin secara paksa memanipulasi lingkungan proses Emacs, yang mencemari hasil proses eksternal yang dibuat dari Emacs. Ini terlalu tidak terduga, dan Emacs tidak memiliki gagasan tentang "buffer local envars".

Ini mungkin membuat frustasi bagi orang-orang yang melihat file python di berbagai proyek dengan persyaratan / lingkungan yang berbeda, tetapi perilakunya jauh lebih dapat diprediksi dengan cara ini.

EDIT: Satu-satunya pengecualian untuk semua ini adalah pipenv. Versi python di modeline memperhitungkan pipenv env saat ini (dan tidak perlu menyetel atau membaca envvars apa pun untuk melakukannya). Jadi pipenv mendapat dukungan kelas satu.


Ini seharusnya dapat menyelesaikan masalah ini secara efektif, tetapi dapat menggunakan lebih banyak pengujian.

Oh, dan lupa menyebutkan, lang / python juga sekarang memiliki tanda modul berikut untuk mengaktifkan fitur ini (atau lainnya):

  • +pyenv
  • +pyvenv
  • +conda
  • +ipython

Luar biasa, itu berhasil! Namun, ketika saya pyenv-mode-mengatur versi pyenv lain (misalnya 3.6.5), itu mengaktifkan lingkungan itu dengan benar tetapi masih meninggalkan modeline yang menampilkan Python 2.7.14, serta versi pyenv yang benar. Karena berfungsi dengan benar, ini bagus - hanya sedikit membingungkan.

Terima kasih telah memperbaikinya!

Hai, Saya baru saja menginstal doom-emacs (dari neovim) baru-baru ini, jadi maafkan saya kurang pengetahuan tentang Emacs secara umum.

Saya mencoba membuat proyek saya (dengan Python) mendeteksi lingkungan pipenv saya dengan benar.

Saya perhatikan di atas Anda menyebutkan bahwa:

  • pyenv: pyenv-mode-set dan pyenv-mode-unset
  • pyvenv: pyvenv-activation dan pyvenv-deactivate
  • conda: conda-env-activation dan conda-env-deactivate

Tapi bagaimana dengan pipenv ? Ketika saya menjalankan :pipenv-activate , saya hanya menerima output berikut:

Finished pipenv --venv

Ketika saya mencoba untuk melihat definisi kode (melalui CD SPC), masih ada tulisan "Tidak ada definisi yang ditemukan".

Apakah saya melewatkan sesuatu?

Terima kasih.

Satu-satunya hal yang dapat saya lakukan untuk menemukan definisi kode adalah jika saya menjalankan:

: pythonic-activation RET / path / ke / virtualenv / RET

Namun, ini cukup mengganggu bagi pengguna pipenv karena jalur virtualenv di pipenv biasanya berada di direktori yang berbeda dari proyek itu sendiri.

@rezmuh Apakah maksud Anda M-x pipenv-activate ? Karena :pipenv bukanlah perintah ex yang sebenarnya (mungkin berhasil, tetapi tidak seperti yang Anda pikirkan).

@hlner Saya mencoba berbagai cara.

Pertama saya melakukannya hanya dengan :pipenv-activate kemudian saya melakukannya dengan M-x pipenv-activate serta SPC : pipenv-activate

Tetapi hasilnya sama yaitu Finished pipenv --venv seperti yang terlihat di bawah ini:

2018-08-12_599x157

Kemudian definisi kode masih belum tersedia

@hlissner python-mode sepertinya tidak berfungsi kecuali saya menginstal python3 di seluruh sistem, saya menggunakan pyenv dan tidak mendeteksi atau mengaktifkan mode-python kecuali saya menginstal python3. Saya memiliki python3 di pyenv dan ini adalah versi global yang ditetapkan untuk akun pengguna saya. Saya tidak yakin apakah ini bug atau hanya kebetulan dari konfigurasi buruk saya.

Sebelum menginstal: python3

screen shot 2018-08-13 at 08 18 59

Setelah menginstal: python3 brew install python3

screen shot 2018-08-13 at 11 17 05

@georgreen Bisakah Anda memeriksa * Pesan * Anda untuk pesan kesalahan atau peringatan (Anda dapat membukanya dengan SPC h e ) ketika Anda membuka mode-python tanpa menginstal python3?

@tokopedia

Untuk beberapa alasan, kombo kunci itu tidak berfungsi, tetapi saya melihat beberapa pesan yang mengeluh tentang pipenv tidak ditemukan di jalur saya. Ini tersedia di python3 shim saya.

screen shot 2018-08-13 at 20 25 07

spc h m kerja

screen shot 2018-08-14 at 19 24 36

pipenv dan python

screen shot 2018-08-13 at 20 30 38

Ketika saya mencoba untuk beralih secara manual menggunakan m-x python-mode : pipenv not found on your path muncul.

Dalam beberapa proyek python-mode hanya gagal dimuat.

screen shot 2018-08-14 at 12 43 24

Saya menduga Anda perlu menambahkan ~ / .pyenv / shims ke PATH Anda dalam file ~ / .profile Anda.

export PATH=~/.pyenv/shims:$PATH

@rphillips jalan saya sudah memilikinya.

@hlissner Memulai emacs melalui terminal dengan mengaktifkan env virtual sepertinya dapat menyelesaikan masalah ini.
screen shot 2018-08-14 at 19 16 42

screen shot 2018-08-14 at 19 16 32

Dari sini, saya pikir sudah dapat disimpulkan bahwa ini adalah masalah jalur.

@hlissner Memperbaiki: sweat_smile :, harap buang semua kekhawatiran saya. Saya menemukan masalah terkait dengan cara ZSH memuat variabel env saya. Yang harus saya lakukan adalah memuatnya dengan benar melalui .profil atau .zshenv untuk kasus ini, semuanya bekerja dengan sempurna sebagaimana mestinya. Saya pikir ini berlaku untuk sisa utas jika jalur Anda disetel gunakan .bash_profile , .profile atau .zshenv sehingga emacs dapat memilih jalur yang benar (saya punya env di zshrc yang tampaknya menjadi penyebab dari semua perilaku yang tidak diharapkan), Jika Anda tidak dapat melakukannya, jalankan emacs Anda dari terminal yaitu emacs .

@georgreen Tidak masalah! Anda benar. .zshrc hanya dibaca di sesi zsh interaktif, sedangkan .zshenv dibaca di semua sesi, interaktif atau lainnya. Saat meluncurkan GUI Emacs di MacOS, Doom membuka shell non-interaktif untuk mengikis lingkungan shell Anda (untuk disalin ke Emacs). Ini adalah perilaku yang benar, meskipun sering menjadi sumber kebingungan.

Namun, ketika saya pyenv-mode-mengatur versi pyenv lain (misalnya 3.6.5), itu mengaktifkan lingkungan itu dengan benar tetapi masih meninggalkan modeline yang menampilkan Python 2.7.14, serta versi pyenv yang benar.

@bsag Mungkinkah itu proyek pipenv? Versi Anda dalam modeline harus mengikuti pyenv-instal pythons, tetapi akan berkonsultasi dengan pipenv terlebih dahulu jika buffer saat ini adalah project pipenv.

Juga, OS apa yang Anda gunakan? Jika Anda menggunakan Linux, bagaimana Anda meluncurkan Emacs?

@hlissner Tidak, saya belum memasang pipenv. Namun, sepertinya saya memiliki masalah yang sama dengan @georgreen karena saya tidak menyetel variabel env di tempat yang tepat. Saya akan memperbaikinya. Sebenarnya ini adalah hal yang sangat berguna untuk dipelajari, jadi terima kasih!

Jadi, inilah sedikit teka-teki. Mudah-mudahan, ini perbaikan yang mudah.

Saya melakukan instalasi baru dari os X Mojave hanya karena dan menginstal python3 melalui pyenv dan pyenv melalui homebrew. Saya mengikuti instruksi yang sangat berguna di utas ini untuk membuat python 3 dikenali oleh DOOM. Saya meletakkan baris yang relevan di file .zshenv sehingga DOOM mengambilnya dan saya memiliki jalur yang benar dengan pyenv shims di depan.

screenshot 2019-02-27 22 34 44

Ini file .zshenv saya
screenshot 2019-02-27 22 36 00

Semuanya bekerja dengan baik untuk sementara waktu sampai saya memulai proyek baru. Tentu saja, saya tidak dapat mengatakan bahwa memulai proyek baru menciptakan masalah ini tetapi saya juga tidak dapat memikirkan hal lain yang berubah. Sekarang ketika saya membuka file python saya mendapatkan sistem default python versi 2.7.10 terlihat di sini:

screenshot 2019-02-27 22 39 08

Seperti yang Anda lihat, saya hanya menginstal Python3 terbaru melalui pyenv
screenshot 2019-02-27 22 38 00

Jika ada yang punya saran, saya akan sangat berterima kasih!

masalah serupa dengan orang di atas. pipenv, setelah diaktifkan, meluncurkan versi interpreter yang tepat. Namun hanya menjalankan SPC-: run-python memberi saya 2.7.15 untuk beberapa alasan.
pada dasarnya pyenv global tidak dihormati.

dengan senang hati memberikan info lebih lanjut tentang penyiapan saya jika diperlukan.

@finnkauski Saya memecahkan masalah saya dengan mengikuti petunjuk di sini .

Saya hanya menempatkan baris berikut di file ~ / .doom.d / config.el

(setq python-shell-interpreter "python3" flycheck-python-pycompile-executable "python3")

Semoga membantu!

Hai,

Saya menggunakan doom-emacs (dari Spacemacs hybrid) di Buster. Sesi saya memiliki PATH yang tepat dan lebih banyak menggunakan variabel lingkungan systemd. Saya menggunakan pyenv dan puisi. Saya biasa menjembatani dengan Emacs dengan meletakkan VIRTUAL_ENV di file .venv dan versi pyenv di file .python-version . Sebenarnya, ini menunjuk ke hal yang sama karena venv ada dalam versi pyenv. Di doom-emacs, sepertinya tidak ada yang dibaca, doom-emacs tetap menggunakan sistem python3 (3.7.3) sedangkan default sistem adalah 2.7.16.

.Doom.d / init.el saya:

       (python
        +pyenv)          ; beautiful is better than ugly

Adakah petunjuk agar Doom menetapkan versi python sesuai dengan versi pyenv?

Salam,

Menjalankan :!pyenv version mengembalikan nilai yang benar.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat