让PyCharm识别Windows Linux子系统(Windows上的Bash)中的Python

47

在Windows上通过本地方式运行Linux版本的Python、pip等工具虽然很棒,但我希望使用一个合适的集成开发环境来实现。由于尚未实现SSHD兼容性,因此我正在尝试让PyCharm将Linux版本的Python识别为本地解释器。

在安装了Windows Linux子系统之后,输入

bash -c python

从 Windows 命令行运行该命令将进入 Python shell。

bash -c "echo \"print 'hello world'\" | python" 

同样有效,可以在Windows shell中输出"hello world"!

我想将它封装为 .bat 文件并将其作为本地解释器呈现给 PyCharm,即:

python.bat:

C:\Windows\System32\bash.exe -c "echo %1 | python" 

无论我尝试哪种变化,都会收到“sdk似乎无效”的错误提示。由于我不确定PyCharm正在执行什么操作来“验证”SDK,因此很难克服这个问题。


你设置了Python的路径吗? - 123
2
请注意,这不是典型的在Windows上安装Python。我正在尝试访问Windows Linux子系统中的Python(请参见https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux)。这不能通过路径解决。 - Boaz Arad
2
有一个关于此的开放功能请求,您可以跟随它(并投票):https://youtrack.jetbrains.com/issue/PY-19129 - Ophir Yoktan
谢谢,我猜一旦微软实现了SSHD所需的缺失功能,这个问题就会得到解决,然后“远程解释器”设置就可以正常工作了。 - Boaz Arad
7个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
34

在Win10上使用PyCharm Professional和WSL Python

PyCharm只能配置为使用WSL Python作为远程解释器(这是由于缺乏其他公共API导致的)。

  • 安装Win10的构建版本14361或更高版本。您也可以升级当前的Insider预览版。
  • 安装wsl(类似于lxrun /install` && lxrun /update
  • 运行bash.exe
  • 更新到最新版本sudo apt-get update && sudo apt-get upgrade
  • 打开/etc/ssh/sshd_config
    • 启用密码身份验证(除非您想使用公共密钥)。打开/etc/ssh/sshd_config,并设置PasswordAuthentication yes
    • 由于在WSL中尚未实现chroot,因此您还需要设置UsePrivilegeSeparation no
    • 保存并关闭它
  • 键入sudo $(sudo which sshd) -d以在前台运行OpenSSH(便于调试)。您应该看到类似于Server listening on 0.0.0.0 port 22的内容。
  • 从另一个bash.exe会话中尝试ssh 127.0.0.1
  • 如果出现关于ECDSA指纹的消息,请输入y。您应该看到密码提示符。如果看到了这个提示符,那么您的服务器就运行正常。

  • 关闭方式为CTRL+C,在守护进程模式下启动服务器(sudo service ssh start)。看起来当前的WSL上start服务是不正常的,所以您需要运行,启动sshd并保持控制台窗口打开,因为当最后一个客户端断开连接时,WSL会停止。您可以创建wsl_ssh.bat文件,类似于bash.exe -c "sudo service ssh start &&& sleep 999d",然后使用它来启动ssh。

  • 配置PyCharm 应该将PyCharm配置为使用WSL作为远程解释器,但不要进行部署,因为Windows上的每个驱动器都映射到WSL中适当的文件夹中/mnt/<DRIVE_NAME>。因此,您只需要配置映射即可。有关远程解释器,请参见configuration-remote-python-interpreters。您应该将127.0.0.1用作主机名,并在第一次lxrun /install之后输入的登录名和密码。您还应该将C:\设置为/mnt/c/在您的映射中。请参见上一篇文章的视频。

    作者:Ilya Kazakevich
    2016年6月14日,17:20

    https://youtrack.jetbrains.com/issue/PY-19129#comment=27-1469350


    我在我的sshd_config文件中找不到“UsePrivilegeSeparation”。我应该添加它还是我的配置文件有问题? - Tyberius
    1
    @Tyberius UsePrivelegeSeperation 已经在更新的 OpenSSH 版本中被弃用。这可能是你所遇到的问题。 - Seanny123
    @Seanny123 嗯,最后我直接向JetBrains询问并获得了相同的答案。好消息是,我认为最新版本的Pycharm将包括原生支持访问WSL。 - Tyberius

    17

    我尝试使用大多数解决方案,但主要问题是我无法将Windows上的OpenSSH降级到JetBrains推荐的7.5以下版本。

    幸运的是,他们已经为我们解决了这个问题!我已经下载了Pycharm 2018.3的早期访问版本。

    https://blog.jetbrains.com/pycharm/2018/10/pycharm-2018-3-eap-7/

    enter image description here

    然而,此功能仅在专业版中提供。


    8
    我想补充bmjjr的回答,这个功能只在PyCharm专业版中可用。遗憾的是,社区版不支持远程解释器功能。 以下是只有在专业版中支持的功能:
    • Cython
    • Django
    • AppEngine
    • Flask
    • Jinja2
    • Mako
    • web2py
    • Pyramid
    • Profiler
    • SQLAlchemy
    • Diagrams
    • Remote interpreters, remote debugging, Vagrant, Docker
    • 重复代码检测
    • 代码覆盖率
    • .po文件支持
    • BDD支持
    • Profiler集成
    • 线程并发可视化
    请参考此处获取更多信息。

    5
    好的,我成功地制作了一个丑陋的工作黑客。您需要在Linux子系统下手动安装python-setuptools和pip。请务必使用PyCharm提供的pip版本,您将在类似于以下路径中找到它:
    C:\Program Files (x86)\JetBrains\PyCharm 2016.1.2\helpers\pip-7.1.0.tar.gz

    然后在“c:\Python”下设置以下脚本为“python.bat”,并将其指定为解释器:

    @echo off
    @setlocal enableextensions enabledelayedexpansion
    :: Requiers pip and setuptools to already be installed on linux subsystem
    Set "Pattern= "
    Set "Replace=\ "
    Set "cdrive=C:"
    Set "linpath=/mnt/c"
    :: Iterate over arguments, convert paths to linux format and concatinate
    
    set argCount=0
    for %%x in (%*) do (
        set /A argCount+=1
        set arg=%%x
        :: Backward slash to forward slash
        SET arg=!arg:\=/!
        :: C drive to /mnt/c/ - default linux subsystem mount point
        SET arg=!arg:%cdrive%=%linpath%!
        :: Space to escaped space
        SET arg=!arg:%Pattern%=%Replace%!
        :: Parethesis to escaped parenteses
        SET arg=!arg:^(=\^(!
        SET arg=!arg:^)=\^)%!
        :: Deqoute voodoo via http://ss64.com/nt/syntax-dequote.html
        SET arg=###!arg!###
        SET arg=!arg:"###=!
        SET arg=!arg:###"=!
        SET arg=!arg:###=!
        if "!args!"=="" (
            set args=!arg!
        ) else (
            set args=!args! !arg!
        )
    )
    :: Dump it to the interpreter
    :: Output is piped inside the Linux subsys, as windows piping for bash seems broken
    START "Terrible hack to avoid pipe error" /W /MIN C:\Windows\System32\bash.exe -c "python !args! > /mnt/c/Python/test" 
    :: Output resulr from piped file
    type c:\Python\test
    :: echo !args!
    EXIT /B > NUL
    

    请原谅我的糟糕编码风格,因为我以前从未开发过Windows批处理文件。

    您可能需要调整目录结构以匹配您的系统。另外,请注意通过Python.bat调用的任何Python脚本的输出都会被管道传输到Linux子系统下的临时文件夹中,然后在Windows下被重新输入。由于某种原因,通过Windows使用bash.exe的输出管道会导致错误。

    希望这可以帮助到您。

    更新:在调用“bash”之前添加了“START”以避免可怕的管道处理错误(参见https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13425768-allow-windows-programs-to-spawn-bash)。


    如果您尝试此操作并收到错误消息:“Windows 找不到 'C:\Windows\System32\bash.exe'。请确保您正确输入了名称,然后重试。”,请确保您以管理员身份运行 PyCharm。导航到安装目录(类似于 C:\Program Files (x86)\JetBrains\PyCharm 2016.1.2\binC:\Users\<USER>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\145.1504.1\bin 如果您使用 JetBrains toolbox 应用程序),右键单击 pycharm.exepycharm64.exe,选择 属性兼容性,然后选中“以管理员身份运行此程序”。 - breandan
    我在尝试添加.bat文件时,从PyCharm收到了“无效的Python解释器”错误消息。 - user1946989
    我尝试了很多不同的路径,但都遇到了“env:‘/Python27/python.bat’:没有那个文件或目录”的问题。 - xApple

    4

    6
    请包含链接的摘录。这将提高Stack Overflow的用户体验并防止链接失效引起的麻烦。 - antitoxic

    2

    通过WSL配置远程解释器 #

    1. 通过以下方式之一打开添加Python解释器对话框:

      • 当您在编辑器中时,最方便的方法是使用状态栏中的Python解释器小部件。单击小部件并选择添加解释器...

      • 如果您在设置/首选项对话框中(Ctrl+Alt+S),请选择项目 | 项目解释器。单击配置项目解释器图标并选择添加。

    2. 在对话框的左侧窗格中,单击WSL。

    使用Anaconda:

    .\rootfs\home\$UserName$\anaconda\envs\$Conda_Env$\bin\python3

    使用Pyhton: 添加WSL解释器

    1. 选择Linux发行版,并指定所选Linux发行版中Python可执行文件的路径。

    完成后,新的解释器将被添加到您的项目中,并设置默认的挂载映射

    新添加的WSL解释器

    请注意,使用WSL无法创建虚拟环境:您安装的所有软件包都将添加到相应的系统解释器中。您将被要求输入sudo密码。

    输入sudo密码

    参考: JetBrains


    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,