LoginSignup
2
1

VSCodeはパスに特定の記号が含まれているとデバッグできない?(Python)

Last updated at Posted at 2020-11-10

タイトル通りなのですが…
バグなのでは?

  • 確認したバージョンは以下の通りです。
    • VS Code 1.51.0, 1.88.1
    • Python 3.8.5, 3.11.0
    • Java 22.0.1

Python以外のデバッグできる言語を使っていないので他の言語は不明です…。
⇒ Javaでも起きます。2回目以降のデバッグでcdする際にパスが変化してデバッグの際エラーになります。(デバッグ自体は可能)

追記24/05/03:GitHubにIssue出しました

が、なんか反応が鈍い…
もし一度でも困ったことがある方いましたら、よければIssueに「私も困ってるんですが」的なコメント等いただけると、重要性が伝わりそうなので良ければよろしくお願いします!

追記:最下部に解決法が書いてあります

「追記3:解決法が(一応)わかりました」のとこ。
(こんなポンコツ記事でもお役に立てたら嬉しいです)

デバックの開始時にパスから記号が削除される

ターミナル
PS C:\Users\User\Documents\○個人用ファイル>  & 'C:\Program Files\Python38\python.exe' 'c:\Users\User\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '62606' '--' 'c:\Users\User\Documents\個人用ファイル\test.py'
Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Program Files\Python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
    cli.main()
  File "c:\Users\User\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy/..\debugpy\server\cli.py", line 430, in main
    run()
  File "c:\Users\User\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy/..\debugpy\server\cli.py", line 267, in run_file
    runpy.run_path(options.target, run_name=compat.force_str("__main__"))
  File "C:\Program Files\Python38\lib\runpy.py", line 264, in run_path
    code, fname = _get_code_from_file(run_name, path_name)
  File "C:\Program Files\Python38\lib\runpy.py", line 234, in _get_code_from_file
    with io.open_code(decoded_path) as f:
FileNotFoundError: [Errno 2] No such file or directory: 'c:\\Users\\User\\Documents\\個人用ファイル\\test.py'
PS C:\Users\User\Documents\○個人用ファイル> 

python.exeに渡しているパスから記号(○)が消えてしまっています。
今まで(VSCodeを使い始める前)は日本語は通常通り使えていたので、丸の記号がダメみたいです。
困るんですけど…。

フォルダ名を変更しなくてもなんとかできる方法ないですかね…。

どの文字が消えるのか検証してみる

ShiftJISの記号のどこが消されてるのか確認してみます。
なお、Pythonコードの内容はprint("success")だけ。

検証コード(邪魔なので折り畳み) ```PowerShell:0_半角カナ PS C:\Users\Ika3\Documents\テスト用> cd 'c:\Users\Ika3\Documents\テスト用'; & 'C:\Program Files\Python38\python.exe' 'c:\Users\Ika3\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '63779' '--' 'c:\Users\Ika3\Documents\テスト用\0_半角カナーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚\test.py' Traceback (most recent call last): (省略) FileNotFoundError: [Errno 2] No such file or directory: 'c:\\Users\\Ika3\\Documents\\テスト用\\0_半角カナーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚\\test.py' PS C:\Users\Ika3\Documents\テスト用\0_半角カナ。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚> ```
1_普通の記号
PS C:\Users\Ika3\Documents\テスト用>  cd 'c:\Users\Ika3\Documents\テスト用'; & 'C:\Program Files\Python38\python.exe' 'c:\Users\Ika3\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '63788' '--' 'c:\Users\Ika3\Documents\テスト用\1_普通の記号 、。,.:;?!`^ ̄_ヽヾゝゞ〃仝々〆〇ー/\~|()〔〕[]{}〈〉《》「」『』【】+-=<>¥$¢£%#&*@〒〓¬Å\test.py' 
Traceback (most recent call last):
  (省略)
FileNotFoundError: [Errno 2] No such file or directory: 'c:\\Users\\Ika3\\Documents\\テスト用\\1_普通の記号\u3000、。,.:;?!`^ ̄_ヽヾゝゞ〃仝々〆〇ー/\~|()〔〕[]{}〈〉《》「」『』【】+-=<>¥$¢£%#&
*@〒〓¬Å\\test.py'
PS C:\Users\Ika3\Documents\テスト用\1_普通の記号 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓∈∋⊆⊇⊂⊃∪∩∧∨¬⇒⇔∀∃・∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬ʼn♯♭♪†‡¶◯>
2_全角数字等
PS C:\Users\Ika3\Documents\テスト用>  cd 'c:\Users\Ika3\Documents\テスト用'; & 'C:\Program Files\Python38\python.exe' 'c:\Users\Ika3\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '63734' '--' 'c:\Users\Ika3\Documents\テスト用\2_全角文字0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\test.py' 
success
PS C:\Users\Ika3\Documents\テスト用\2_全角文字0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz> 
3_普通のかなカナ
PS C:\Users\Ika3\Documents\テスト用>  cd 'c:\Users\Ika3\Documents\テスト用'; & 'C:\Program Files\Python38\python.exe' 'c:\Users\Ika3\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '63742' '--' 'c:\Users\Ika3\Documents\テスト用\3_普通のかなカナぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわ 
ゐゑをんァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ\test.py' 
success
PS C:\Users\Ika3\Documents\テスト用\3_普通のかなカナぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんァアィ
イゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ>
4_ギリシャ文字
PS C:\Users\Ika3\Documents\テスト用>  cd 'c:\Users\Ika3\Documents\テスト用'; & 'C:\Program Files\Python38\python.exe' 'c:\Users\Ika3\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '63747' '--' 'c:\Users\Ika3\Documents\テスト用\4_ギリシャ文字ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω\test.py' 
success
PS C:\Users\Ika3\Documents\テスト用\4_ギリシャ文字ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω> 
5_キリル文字
PS C:\Users\Ika3\Documents\テスト用>  cd 'c:\Users\Ika3\Documents\テスト用'; & 'C:\Program Files\Python38\python.exe' 'c:\Users\Ika3\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '63754' '--' 'c:\Users\Ika3\Documents\テスト用\5_キリル文字АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя\test.py' 
success
PS C:\Users\Ika3\Documents\テスト用\5_キリル文字АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя> 
6_罫線
PS C:\Users\Ika3\Documents\テスト用>  cd 'c:\Users\Ika3\Documents\テスト用'; & 'C:\Program Files\Python38\python.exe' 'c:\Users\Ika3\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '63797' '--' 'c:\Users\Ika3\Documents\テスト用\6_罫線\test.py' 
Traceback (most recent call last):
  (省略)
FileNotFoundError: [Errno 2] No such file or directory: 'c:\\Users\\Ika3\\Documents\\テスト用\\6_罫線\\test.py'
PS C:\Users\Ika3\Documents\テスト用\6_罫線─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂> 
7_機種依存文字
PS C:\Users\Ika3\Documents\テスト用>  cd 'c:\Users\Ika3\Documents\テスト用'; & 'C:\Program Files\Python38\python.exe' 'c:\Users\Ika3\.vscode\extensions\ms-python.python-2020.10.332292344\pythonFiles\lib\python\debugpy\launcher' '63768' '--' 'c:\Users\Ika3\Documents\テスト用\7_機種依存文字ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟㏍㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼\test.py' 
Traceback (most recent call last):
  (省略)
FileNotFoundError: [Errno 2] No such file or directory: 'c:\\Users\\Ika3\\Documents\\テスト用\\7_機種依存文字ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟㏍㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼\\test.py'
PS C:\Users\Ika3\Documents\テスト用\7_機種依存文字①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ・㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪> 

結果

Unicodeのなんやかんやが関係してそう?かも?
その辺は全く知らないので結果がバラけている!としかいえない…

消える

  • 0_半角カナ
    。「」、・ヲァィゥェォャュョッ

  • 1_普通の記号
    ・゛゜´¨―‐∥…‥‘’“”±×÷≠≦≧∞∴♂♀°′″℃§☆★○●◎◇◆□■△▲▽▼※→←↑↓∈∋⊆⊇⊂⊃∪∩∧∨⇒⇔∀∃・∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬‰♯♭♪†‡¶◯

  • 6_罫線(全滅)
    ─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂

  • 7_機種依存文字
    ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳・№℡≒≡∫∮∑√⊥∠∟⊿∵∩∪

消えない

  • 0_半角カナ
    ーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚

  • 1_普通の記号
     、。,.:;?!`^ ̄_ヽヾゝゞ〃仝々〆〇ー/\~|()〔〕[]{}〈〉《》「」『』【】+-=<>¥$¢£%#&*@〒〓¬Å

  • 2_全角数字系
    (全て残る)

  • 3_普通のかなカナ
    (全て残る)

  • 4_ギリシャ文字
    (全て残る)

  • 5_キリル文字
    (全て残る)

  • 7_機種依存文字
    ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟㏍㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼

追記:原因はPowerShellの不具合

PowerShellのPSReadLineモジュールの不具合だそうです。

参考URL:windows - PowerShell(x64)のウィンドウに、ファイル名に記号を含むファイルをドラッグ&ドロップすると文字が欠落してしまう - スタック・オーバーフロー
参考URL2:PowerShell で全角文字を入力すると表示がおかしくなる問題について

これは、PowerShellの文字に色を付けて見やすくする機能が全角文字を扱うの下手くそ(意訳)だという不具合だそうなのですが…
それに関連して、PowerShellのウィンドウにファイルをドラッグ&ドロップで渡すと特定の記号が消失する、という不具合も発生しているようです。

VSCodeのデバッグ時にパスを渡すときにドラッグ&ドロップのような方法でパスを渡しているらしく、それのせいで上述の記号が消失し、パスが違うものになってしまっているみたい。

なお、22年9月現在もこの不具合は全く修正されていないようです。

解決策案

  • パスに全角文字が入らないようにする
    • 解決してない
  • VSCodeの設定のterminal.integrated.defaultProfile.windowsから、既定のターミナルをcmd.exeに変更する
    • せっかくのPowerShellを使わなくなるが、楽
  • PowerShellからPSReadLineRemove-ModuleもしくはUninstall-Moduleする
    • いろいろ試したが、できなかった。色を付けるだけのモジュールらしいので、できるならこれが手軽かも
      参考:Stack Overflow
    • 追記:管理者権限のcmd.exeからPowerShell Uninstall-Module PSReadLine -RequiredVersion 2.0.0というようにやるといいかも?(未確認)
    • 追記2:上記コマンドを実行しても、アンインストールされずに2.0.0がしつこく残り続ける。
  • PowerShellのPSReadLineInstall-ModuleもしくはUpdate-Moduleしてバージョンを2.2.6にし、PSReadLineを読み込めなくする
    • 解決策として頭が悪い(偶然読み込まなくなっただけ…というかなんで読み込まなくなったのかナゾ)
    • 追記:PSスクリプトファイルを実行できるようにするためにSet-ExecutionPolicy RemoteSignedでセキュリティを緩くしたところ、再びPSReadLineが読み込まれるようになった。日本語が表示できなくなるので困る。よくわかっていないが、要するにアップデートしたことによって署名が無効なモジュールになったせいで読み込めなくなった…ということだったみたい?(困る)
    • 追記2:一時的にSet-ExecutionPolicy AllSignedにしてPSReadLineを再インストールしようとしたところ、「署名が無効です」的なエラーが出てインストールできなくなっていた。
      Install-Module PSReadLine -Force -SkipPublisherCheckで署名の検証をスキップすることでインストールを強行したところ、再びPSReadLineを読み込めなくなり、再びPythonコードをデバッグできるようになった。
      加えてなんと、Set-ExecutionPolicy RemoteSignedの状態でもPSReadLineを読み込まなくなった。
      めでたしめでたし。(めでたくない)
    • 追記3:結局なんでPSReadLineを読み込まなくなったのかよくわかっていなかったが、やっと原理がわかった。上記の追記2ではなんで読み込まなくなったのかわかっていなかった。(後述)

追記3:解決法が(一応)わかりました

方法1

  1. 管理者権限のPowerShellを起動しておく
  2. Install-Module PSReadLine -Forceを実行し、バージョンの新しいPSReadLineをインストールする
  3. Set-ExecutionPolicyで実行ポリシーの変更をしていなければ、PowerShell起動時にインストールしたPSReadLineを読み込もうとして失敗するようになる
  4. 悪さをしているへっぽこPSReadLineがいなくなるので、どんな全角文字でもPowerShellに渡せるようになる
  5. めでたしめでたし

方法2

スクリプトファイル*.ps1の実行のためにSet-ExecutionPolicy RemoteSignedしてあり、上記の方法1ではPowerShell起動時にPSReadLineを読み込んでしまう場合。

  1. 管理者権限のPowerShellを起動しておく
  2. Get-ExecutionPolicy -Listで現在の実行ポリシーの状態を表示し、覚えておく
  3. Set-ExecutionPolicy AllSignedを実行し、実行ポリシーをAllSignedに変更する
  4. PowerShellでInstall-Module PSReadLine -Forceを実行し、バージョンの新しいPSReadLineをインストールする
  5. PowerShellを新しく起動し、インストールしたPSReadLineを読み込もうとして下記のメッセージが出る
    この信頼されていない発行元からのソフトウェアを実行しますか?
    ファイル C:\Program Files\WindowsPowerShell\Modules\PSReadline\2.3.4\PSReadLine.format.ps1xml の発行元は
    CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
    であり、このシステムで信頼されていません。信頼された発行元からのスクリプトのみを実行してください。
    [V] 常に実行しない(V)  [D] 実行しない(D)  [R] 一度だけ実行する(R)  [A] 常に実行する(A)  [?] ヘルプ (既定値は "D"):
    
  6. [V] 常に実行しない(V)を選択し、Microsoftの証明書を信頼しない発行元に追加してしまう(強引)
  7. 以降、PSReadLineを読み込みたくても読み込まなくなる
  8. めでたしめでたし
  9. 忘れずにSet-ExecutionPolicy RemoteSigned(もしくは他のポリシー)を実行し、実行ポリシーを1.の状態に戻しておく

ほかにもMicrosoft製モジュールをインストールしている場合、そっちも問答無用で読み込まなくなりそう…
なお、信頼しない設定を解除したい場合は
コントロールパネル>インターネットオプション>コンテンツ>証明書>信頼されない発行元>Microsoft Corporation
で「削除」を行うことで設定を解除することができる。

参考ページ

同じ現象について言及しているブログ

Set-ExecutionPolicy解説ページ

Install-Moduleで署名の検証を突破する方法

ただの文字コード表

「常に実行しない」の解除方法

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1