ãã®èšäºã§ã¯ã VS Codeãšãã£ã¿ãŒã§æ°åã¯ãªãã¯ããã ãã§ãPythonã¹ã¯ãªãããéçºããéé¢ãããç°å¢ã§å®è¡ããããã®éçºç°å¢ã®ã»ããã¢ãããå ±æããããšæããŸãã
éé¢ãããç°å¢ãšããŠãUbuntu 17.10 OSãå®è¡ããLXCããŒã¹ã®ã³ã³ãããŒã®åææ§æãšäœæãæ€èšãããŸãã ãªãDockerã§ã¯ãããŸãããïŒ ããã€ãã®è°è«ãããããšã¯ãçããã®ãé£ããã§ãã éšåçã«ãOSä»®æ³åã®æŠå¿µã¯ããã»ã¹ä»®æ³åããã粟ç¥çã«äž»èŠ³çã«è¿ãã§ãããããã§èª¬æããååã¯ãä¿®æ£ãå ããŠãDockerã³ã³ãããŒã§ã³ãŒããå®è¡ããã®ã«é©ããŠããŸãã
![](https://habrastorage.org/webt/nq/jl/5x/nqjl5xk37gigjbn8qfqh9yacos8.png)
ããªãã¯äœãåŸãŸããïŒ
- ã³ã³ããå ã§ã¯ã³ã¯ãªãã¯ã§Pythonã¹ã¯ãªãããå®è¡ããæ¹æ³ãšãVS Codeããã®ãªã¢ãŒããããã°ãåŠã¶
- LXDãã€ã³ã¹ããŒã«ãããããã¯ãŒã¯ãæ§æããæåã®ã³ã³ãããŒãéå§ããæ¹æ³ãåŠã¶
- VS CodeãœãŒã¹ã³ãŒããšãã£ã¿ãŒã®ã€ã³ã¹ããŒã«ãšæ§æã確èªããŠãã ãããVSCodeãœãŒã¹ã³ãŒããšãã£ã¿ãŒã¯ãå¿«é©ã«ã³ãŒããèšè¿°ããŠãããã°ã§ããæ¡åŒµæ©èœã®ã»ããã§ãã
ããã«ãªããã®ã¯äœã§ããïŒ
- LXC / LXDã®å®å šãªã¬ãã¥ãŒã¯ãããŸãããLinuxã³ã³ããã«é¢ããè¿œå æ å ±ãèªåã§èŠã€ããå¿ èŠããããŸãã
- éçºè ã®ãã¹ãã§ä»®æ³ç°å¢ãäœæããããã®python virtualenvã¢ãžã¥ãŒã«ã¯ãã³ã³ãããŒã®ä»£æ¿ãšã¯èŠãªãããŸããã
- DockerãšLXDã®ç²Ÿç¥ã®æ¯èŒã¯ãããŸãããçµéšã«åºã¥ããŠèªåã§çµè«ãå°ããŸãã
å 容ïŒ
- ããã¯ãšã³ããªããžããªã®éžæ
- LXDããã±ãŒãžãã€ã³ã¹ããŒã«ãã
- LXDãåæåãã
- LXCãããã¯ãŒã¯æ§æ
- ã³ã³ãããŒæ§æãããã¡ã€ã«ã®äœæ
- ã³ã³ããäœæ
- ã³ã³ããã«ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãã
- VSã³ãŒããšæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ãã
- VSã³ãŒããæ§æãã
- ãã£ã¬ã¯ããªãªã³ã¯ãã¹ã<->ã³ã³ãã
- ã³ã³ããã§ã¹ã¯ãªãããå®è¡ããããã®VSã³ãŒãã®æ§æ
- VSã³ãŒãã§ã®ãªã¢ãŒããããã°
- å€éšPythonã©ã€ãã©ãªçšã®IntelliSense
ããã¯ãšã³ããªããžããªã®éžæ
LXDãã€ã³ã¹ããŒã«ããåã«ã䜿çšããã³ã³ããã®ããã¯ãšã³ãã¹ãã¬ãŒãžã®ã¿ã€ãã決å®ããå¿ èŠããããŸãã åŸã§å€æŽããããšã¯ã§ããŸããã ããã€ãã®ãªãã·ã§ã³ãå©çšå¯èœã§ãïŒZFSãbtrfsãLVMããŸãã¯ãã¹ããã¡ã€ã«ã·ã¹ãã ã æ¯èŒã®ããã«ãå ¬åŒããã¥ã¡ã³ãã«æ¯èŒè¡šããããŸãã å°æ¥ãã³ã³ããã®COW ïŒã³ããŒãªã³ã©ã€ãïŒã¹ãããã·ã§ãããç°¡åã«äœæã§ããZFSãéžæããããšããå§ãããŸãã ZFSãŠãŒãã£ãªãã£ããã±ãŒãžãã·ã¹ãã ã«ã€ã³ã¹ããŒã«ããŸãã
$ sudo apt install zfsutils-linux
LXDããã±ãŒãžãã€ã³ã¹ããŒã«ãã
åé¡ã¯ãããŸãããããã±ãŒãžã¯ã·ã¹ãã ã®æšæºé ä¿¡ã«å«ãŸããŠãããããã³ã³ãœãŒã«ã§ã³ãã³ããå®è¡ããŸãã
$ sudo apt install lxd
LXDãã€ã³ã¹ããŒã«ãããšãçŸåšã®ãŠãŒã¶ãŒãlxdã·ã¹ãã ã°ã«ãŒãã«è¿œå ãããŸãããã·ã¹ãã ã§å¿ èŠãªç¹æš©ã䜿çšããŠæ§æãç¶è¡ããã«ã¯ããŠãŒã¶ãŒã»ãã·ã§ã³ãåã¢ã¯ãã£ãåããå¿ èŠããããŸã ã ãã°ã¢ãŠãããŠDesktop Menegerã®ã»ãã·ã§ã³ãåå ¥åããããå®å šã«åèµ·åããŠãã ããã idã³ãã³ãã䜿çšããŠãçŸåšã®ãŠãŒã¶ãŒã»ãã·ã§ã³ãlxdã°ã«ãŒãã«ãããã©ããã確èªã§ããŸãã
$ id uid=1000(user1) gid=1000(user1) groups=1000(user1),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),118(lpadmin),128(sambashare),129(lxd)
lxdã°ã«ãŒãã衚瀺ãããŠããã°ããã¹ãŠåé¡ãããŸãããç¶è¡ã§ããŸãã
LXDãåæåãã
LXDã®åæåã¯ã lxdã°ã«ãŒãã®ã¡ã³ããŒã§ããçŸåšã®ãŠãŒã¶ãŒã«ä»£ãã£ãŠã€ã³ã¿ã©ã¯ãã£ãã«å®è¡ãããŸãã ã³ãã³ããå®è¡ãã以äžã®æ瀺ãšã³ã¡ã³ãã«åŸã£ãŠãã ããïŒ
$ lxd init # , ? ZFS! # <yes>, <ENTER> Do you want to configure a new storage pool (yes/no) [default=yes]? # <ENTER> Name of the new storage pool [default=default]: lxdpool # , ZFS Name of the storage backend to use (dir, lvm, zfs) [default=zfs]: zfs # ZFS ? .. lxdpool ZFS . # <ENTER> Create a new ZFS pool (yes/no) [default=yes]? # , ? # , dd # . # <no>, <ENTER> Would you like to use an existing block device (yes/no) [default=no]? # loop- (zfs pool)? # GB, 1GB Size in GB of the new loop device (1GB minimum) [default=15GB]: 5 # LXD ? # LXD , - unix /var/lib/lxd/unix.socket # <no>, <ENTER>: Would you like LXD to be available over the network (yes/no) [default=no]? # ? Would you like stale cached images to be updated automatically (yes/no) [default=yes]? no # ? <no>, Would you like to create a new network bridge (yes/no) [default=yes]? no # LXD has been successfully configured.
LXCãããã¯ãŒã¯æ§æ
ããã§ãããã¯ãŒã¯ãèšå®ãããã³ã³ããã®äœæã«é²ããšãã³ã³ãããäœæããããšãã³ã³ãããã©ã®ãããã¯ãŒã¯ã«ãæ¥ç¶ãããŠããªããšããèŠåã衚瀺ãããŸãã ããã¯ãšã©ãŒã§ã¯ãªããåã«ã€ã³ã¿ãŒãã§ã€ã¹ãä»ãããããã¯ãŒã¯ã¢ã¯ã»ã¹ããããŸããã æåã«ãå¿ èŠãªæ°ã®ã³ã³ãããäœæãã lxc network attachã³ãã³ãã䜿çšããŠãããã¯ãŒã¯ãæ§æããã³ã³ãããã³ã³ããã«æ¥ç¶ã§ããŸãã 次ã«ãæ§ç¯ãããããã¯ãŒã¯ã®ã¿ã€ãã決å®ããå¿ èŠããããŸãã LXCãããã¯ãŒã¯ã®æ§ç¯ã«ã¯ããã€ãã®ãªãã·ã§ã³ããããŸããã ããªããžãªãã·ã§ã³ïŒãã¹ããšã³ã³ããéã®åçŽãªãœãããŠã§ã¢ã¹ã€ããïŒãéžæããããã«åºã¥ããŠãããã¯ãŒã¯ãæ§ç¯ããŸãã
ãããã¯ãŒã¯ããªããžãäœæããå Žåãååãæå®ããåŸããã«ããããã£ãèšå®ããããIPv4ããã³IPv6ãµãããããã©ã³ãã ã«éžæããèªåæ§æã«äŸåã§ããŸãã ããã©ã«ãã§ã¯ããã©ã¡ãŒã¿ãŒã¯ipv4.nat = falseã§ãããäœããã®çç±ã§ãã³ã³ãããŒããã®ééãã©ãã£ãã¯ã®ãã±ããã¯ããã¹ãã«ãŒãã«ã§IP転éãæ瀺çã«æå¹ã«ããŠãããã¹ããè¶ããŠä»ã®ããŒã«ã«ãããã¯ãŒã¯ã»ã°ã¡ã³ãã«ã«ãŒãã£ã³ã°ãããŸããã ã©ãããLXDã®NATã¯ãããŒã«ã«ãããã¯ãŒã¯ã»ã°ã¡ã³ãããã°ããŒãã«ãžã®ã¢ãã¬ã¹ã®ãã©ã³ã¹ã¬ãŒã¿ãŒä»¥äžã®ãã®ã§ãããã®ãªãã·ã§ã³ãã¢ã¯ãã£ãã«ãããšããã¹ãã®IP転éãã¢ã¯ãã£ãã«ãªããããæ瀺çã«æå¹ã«ããŸãã
$ lxc network create lxdbr0 ipv6.address=none ipv4.address=10.0.3.1/24 ipv4.nat=true Network lxdbr0 created $ lxc network list +--------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +--------+----------+---------+-------------+---------+ | ens33 | physical | NO | | 0 | +--------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 0 | +--------+----------+---------+-------------+---------+
ã³ã³ãããŒæ§æãããã¡ã€ã«ã®äœæ
ã³ã³ããã®æ§æã¯ãæ¡ä»¶ä»ãã§ã°ããŒãã«ãšããŒã«ã«ã®2ã€ã®ã¬ãã«ã«åããããŸãã ã°ããŒãã«æ§æã¯ãç¹å®ã®ã³ã³ãããŒãŸãã¯ã³ã³ãããŒã®ã°ã«ãŒãã«æ¥ç¶ãããŠããæ§æãããã¡ã€ã«ã§æå®ãããããŒã«ã«æ§æã¯ç¹å®ã®ã³ã³ãããŒã«ã®ã¿é©çšãããŸãã ã€ãŸãããããã¡ã€ã«å ã®ãã¹ãŠã®èšå®ãã³ã³ããã«ç¶æ¿ãããããŒã«ã«èšå®ããããã¡ã€ã«ãããåªå ãããŸãã 1ã€ã®ã³ã³ããã«è€æ°ã®ãããã¡ã€ã«ãæ·»ä»ã§ããŸãã
LXDãããã¡ã€ã«ãäœæããŠãæ°ããäœæãããã³ã³ããããã¹ãäžã®lxdbr0ã¹ã€ããïŒãããã¯ãŒã¯ããªããžïŒã«ãªã³ã¯ãããã¿ã€ãnicã®ã€ã³ã¿ãŒãã§ãŒã¹ãæã€ããã«ããŸãã
$ lxc profile copy default network0 $ lxc profile device add network0 eth0 nic parent=lxdbr0 nictype=bridged
ã³ã³ããäœæ
ããšãã°ãã³ã³ãããäœæããŠpytestãšåŒã¶ãšããã®ååã§ãã¹ãããã¢ã¯ã»ã¹ã§ããŸãã ubuntuãªããžããªããã€ã¡ãŒãžãããŠã³ããŒãããèµ·åã³ãã³ããå®è¡ããŸãïŒããŒãžã§ã³17.10ããã³amd64ã¢ãŒããã¯ãã£ãšããã®ã€ã¡ãŒãžããã³ã³ãããŒãäœæããŸãã ããã«ããªãã·ã§ã³ã¯ããã®ã³ã³ãããŒãnetwork0ãããã¡ã€ã«ããæ§æããå¿ èŠãããããšã瀺ããŸãã
$ lxc launch ubuntu:17.10/amd64 --profile network0 pytest
次ã«ããããã¯ãŒã¯ããã€ã¡ãŒãžãããŠã³ããŒãããŸãã å°ãåŸ ã£ãŠãå°ãåŸã§ã·ã¹ãã ã§äœ¿çšå¯èœãªã³ã³ãããšãã®ã¹ããŒã¿ã¹ã確èªã§ããŸãã
$ lxc list +--------+---------+------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +--------+---------+------------------+------+------------+-----------+ | pytest | RUNNING | 10.0.3.13 (eth0) | | PERSISTENT | 0 | +--------+---------+------------------+------+------------+-----------+
ã³ã³ããã«ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãã
ããã§ãå¿ èŠãªãœãããŠã§ã¢ãã³ã³ããã«ã€ã³ã¹ããŒã«ããŸãã ã·ã¹ãã ãæŽæ°ããã³ã³ããå ã§ããã±ãŒãžãããŒãžã£ãå®è¡ããŸãã
$ lxc exec pytest -- /bin/bash -c 'apt update && apt upgrade -y'
次ã«ã pipããã±ãŒãžãããŒãžã£ãŒïŒPythonããã±ãŒãžã€ã³ã¹ããŒã©ãŒïŒãšptvsd pythonã¢ãžã¥ãŒã«ïŒPythonçšVisual Studioãªã¢ãŒããããã°ãµãŒããŒïŒãã€ã³ã¹ããŒã«ããŸãã ptvsdã¢ãžã¥ãŒã«ã¯å¿ ãããŒãžã§ã³3.0.0ã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸããææ°ããŒãžã§ã³ïŒçŸåšã®3.2.1.0ïŒã§ã¯ãgithub.comã®åé¡ã«ç€ºãããŠãããšã©ãŒãåãåããŸããã äžæçãªãœãªã¥ãŒã·ã§ã³ãšããŠptvsdãšå¯Ÿè©±ããVS Codeã®Pythonæ¡åŒµã®äœæè ã¯ãããŒãžã§ã³3.0.0ã®äœ¿çšãæšå¥šããŠããŸãã
$ lxc exec pytest -- /bin/bash -c 'apt install python3-pip -y' $ lxc exec pytest -- /bin/bash -c 'pip3 install ptvsd==3.0.0'
LXDã«é¢ããŠã¯ãã»ããã¢ãããå®äºããŸããã
VSã³ãŒããšæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ãã
ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ãªãã·ã§ã³ã¯ãå ¬åŒããŒãžã®code.visualstudio.com/docs/setup/linuxã§èª¬æãããŠããŸãããã³ãã³ããå°ãå€æŽããŸãã
$ cd ~ $ wget -c https://packages.microsoft.com/keys/microsoft.asc $ cat microsoft.asc | gpg --dearmor > microsoft.gpg $ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg $ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list' $ sudo apt update $ sudo apt install code
å®è¡åŸãMicrosoftãªããžããªã®ææ°ããŒãžã§ã³ã®VSã³ãŒããã·ã¹ãã ã«è¡šç€ºãããŸãã
PSå·çã®æç¹ã§ãæ°ããããŒãžã§ã³1.18.0ããªãªãŒã¹ãããŸãããç§ã®æèŠã§ã¯ãæãæåŸ ãããŠããïŒ2幎ïŒã³ãã¥ããã£æ©èœã®ããã€ãã¯ãããã«ãã«ãŒãã¯ãŒã¯ã¹ããŒã¹ããšããšã¯ã¹ãããŒã©ãŒã®Gitã€ã³ãžã±ãŒã¿ãŒããå®å®ããã¢ã»ã³ããªã«å«ãŸããŠããŸããããã¹ãŠã®å€æŽã«ã€ããŠèªãããšãã§ããŸããã®ããŒãž ã
æ¡åŒµæ©èœã®ã€ã³ã¹ããŒã«ã«é²ã¿ãŸãã ããšãã°ã Atomã ïŒäœæè ãšããŠïŒäœ¿çšããåŸã«VS CodeãåããŠã€ã³ã¹ããŒã«ããå Žåã¯ã以äžã®ãªã¹ãã®æ¡åŒµæ©èœã«æ³šæããããšããå§ãããŸãããã®èšäºã®ç®çãéæããã«ã¯ãPythonãšCode Runnerã®ã¿ãã€ã³ã¹ããŒã«ããã ãã§ååã§ãã æ¡åŒµæ©èœã¯ããšãã£ã¿ãŒã®å·ŠåŽã®ããŒã±ãããã¬ã€ã¹ããã€ã³ã¹ããŒã«ãããŸãã
- CSSã¯ã©ã¹åã®IntelliSense
- Python
- ãžã³ãžã£
- Djangoãã³ãã¬ãŒã
- ãã¡ã€ã«ã¢ã€ã³ã³
- ã¯ã³ããŒã¯ãã
- 埮åŠãªãããæ¬åŒ§
- è€å ãã€ã©ã€ã
- ã³ãŒãã©ã³ããŒ
VSã³ãŒããæ§æãã
以äžã®èšå®ã¯ãªãã·ã§ã³ã§ãããã³ã³ããã§ã®Pythonã¹ã¯ãªããã®å®è¡ã«çŽæ¥é¢ä¿ããŸããããAtomã®ããã«èŠèŠçã«ãããå Žåã¯ãããã«ããè¿ã¥ããŸãã
éããŠãããšãã£ã¿ãŒã§ããšãã£ã¿ãŒã®èšå®ãéããŸãïŒãã¡ã€ã«->èšå®->èšå®ã å³åŽã®USER_SETTINGSã§éããŠã£ã³ããŠã§ã次ã®å€æŽãå ããŠä¿åããŸãïŒCtrl + SïŒïŒ
{ // "telemetry.enableTelemetry": false, "editor.fontFamily": "Menlo, Consolas, 'DejaVu Sans Mono', monospace", "editor.lineHeight": 21, "editor.minimap.enabled": true, "editor.minimap.showSlider": "always", "editor.minimap.renderCharacters": false, "files.insertFinalNewline": true, "files.trimFinalNewlines": true, "explorer.openEditors.visible": 0, // : "terminal.integrated.lineHeight": 1.25, "terminal.integrated.scrollback": 2000, // : "workbench.iconTheme": "file-icons", "workbench.colorTheme": "One Dark Pro", "workbench.colorCustomizations": { // https://code.visualstudio.com/docs/getstarted/theme-color-reference "editor.lineHighlightBackground": "#2C323C" }, // "editor.matchBrackets": false, "subtleBrackets.styles": { "global": { "color": "#61afef", "borderColor": "#61afef", "borderWidth": "1px", "borderStyle": "none none solid none" } }, // Python "python.pythonPath": "python3", // -: "code-runner.executorMap": { "python": "python3 $fileName" } }
ãã£ã¬ã¯ããªãªã³ã¯ãã¹ã<->ã³ã³ãã
ç§ãã¡ã¯ãã§ã«çŽ æŽãããä»äºãããŠãããæçµæ®µéã«æ¥ãŠããŸãã ããã§ãã³ã³ããã§ã¹ã¯ãªãããå®è¡ããæºåãã»ãŒãã¹ãŠæŽããŸããã
/ home / user1 / projectsãªã©ã« ãããžã§ã¯ããã£ã¬ã¯ããªãäœæããŸãã å°æ¥ã®Pythonãããžã§ã¯ãããã¹ãããŸãã ãã®ãã£ã¬ã¯ããªãã³ã³ããã«ãªã³ã¯ããŸããã€ãŸããã³ã³ããå ã§ãã£ã¹ã¯ããã€ã¹ãäœæãããã®ãã£ã¬ã¯ããªãinternal / mnt / hostfsã«é¢é£ä»ããŸãã 次ã®ã³ãã³ããå®è¡ããŸãã
$ mkdir ~/projects $ lxc config device add pytest hostfs disk path=/mnt/hostfs source=/home/user1/projects/
/ home / user1 / projectsãã£ã¬ã¯ããªã«ãã£ã¬ã¯ããªãŸãã¯ãã¡ã€ã«ãããŒã«ã«ã§äœæãããšãã¢ãã¬ã¹/ mnt / hostfsã®ã³ã³ããã«ããã«åæ ãããŸãã ããã確èªããã«ã¯ãã³ã³ããã§BASHã·ã§ã«ãã€ã³ã¿ã©ã¯ãã£ãã«å®è¡ããlsã³ãã³ããçºè¡ããŸãã
$ lxc exec pytest -- /bin/bash $ ls -l /mnt/hostfs/
ã³ã³ããå ã®ãã¡ã€ã«ãšãã£ã¬ã¯ããªãèªã¿åãå°çšã«ãªãã nobodyïŒnogroupã«çããUIDïŒGIDãæã€ããšãããããŸãã ã¹ã¯ãªãããå®è¡ããã«ã¯ããã§ååã§ãããã³ã³ããå ã®ãã¡ã€ã«ãšãã£ã¬ã¯ããªãæžã蟌ã¿å¯èœã«ããå¿ èŠãããå Žåã¯ã ãã®èšäºã® ã ãŠãŒã¶ãŒ/ã°ã«ãŒãã®çŽæ¥ãããã³ã° ãã®ç« ããèªã¿ãã ãã ã
ã³ã³ããã§ã¹ã¯ãªãããå®è¡ããããã®VSã³ãŒãã®æ§æ
ãã®ããããšãã£ã¿ãŒãéããŠããå床éãããšãã§ããããã«ãªããŸããã ã¡ãã¥ãŒãã¡ã€ã«->æ°èŠãã¡ã€ã«ãã¯ãªãã¯ããŸã ã æ°ããã¿ããäœæããã次ã®python-codeãäœæããå¿ èŠããããŸãããã®ã³ãŒãã¯ã³ã³ããã§å®è¡ããŸãã ãã£ã¬ã¯ããª/ home / user1 / projects / pytest / test.pyã«ä¿åããŠããããã¡ã€ã«ïŒã¿ãïŒãéããããšãã§ããŸãã
import os #### BEGIN. Visual Studio remote debugging server for Python # import ptvsd # print('Waiting connection on port 3000') # ptvsd.enable_attach('my_secret', address=('0.0.0.0', 3000)) # ptvsd.wait_for_attach() # ptvsd.break_into_debugger() #### END. Visual Studio remote debugging server for Python with open('/etc/lsb-release') as f: lsb_release = f.readlines() info = { 'HOSTNAME': os.uname().nodename, 'DISTRIB': lsb_release[3][21:-2], 'USER': os.environ['USER'], 'LOGNAME': os.environ['LOGNAME'], 'HOME': os.environ['HOME'], 'PWD': os.environ['PWD'] } print(info)
VS Codeã¯ãpylintã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ãããŠããªãããšããèšããŸããããä»ã¯å¿ èŠãããŸãããpipã¢ãžã¥ãŒã«ãããŒãžã£ãŒã䜿çšããŠãåŸã§èªåã§ã€ã³ã¹ããŒã«ã§ããŸãã 次ã«ãVS Codeã§ã¯ãŒã¯ã¹ããŒã¹ãéãå¿ èŠããããŸãããã®ããã«ã¯ã ãã¡ã€ã«ãšã¯ã¹ãããŒã©ãŒã®å·ŠåŽã§ã [ ãã©ã«ããŒãéã ]ãã¿ã³ãã¯ãªãã¯ãããã£ã¬ã¯ããª/ home / user1 / projects / pytest /ãéžæããŸãã
![](https://habrastorage.org/webt/im/_9/rj/im_9rjju1_c4daxe3kielcs3qnu.png)
VS Codeãååæåããããã¹ãŠã®ãŠã£ã³ããŠãå®å šã«éããããtest.pyãã¡ã€ã«ã衚瀺ãããã¯ãŒã¯ã¹ããŒã¹ãéããŸãã File Explorer VS Codeã®å·ŠåŽã®ååãããã«ã¯ãªãã¯ããŠéããŸãã
[ãã¡ã€ã«]-> [èšå®]-> [èšå®]ã¡ãã¥ãŒãã¯ãªãã¯ããŠã¯ãŒã¯ã¹ããŒã¹ã®èšå®ãåŒã³åºããå³äžã®ãŠã£ã³ããŠã§USER_SETTINGSã®ä»£ããã«ããããããŠã³ãªã¹ãããWORKSPACE_SETTINGSãéžæããŸãã
![](https://habrastorage.org/webt/2t/f9/oq/2tf9oqppqc6wdkv00tmikxzu1xc.png)
次ã®èšå®ãäœæããŠä¿åãã次ã®ããã«ããŸãã
{ "code-runner.executorMap": { // root: // "python": "lxc exec pytest -- /bin/bash -c 'cd /mnt/hostfs/pytest && python3 $fileName'" // ubuntu: "python": "lxc exec pytest -- /bin/bash -c 'su -l ubuntu -c \"cd /mnt/hostfs/pytest && python3 $fileName\"'" }, "code-runner.runInTerminal": true }
ãã¡ã€ã«ãšã¯ã¹ãããŒã©ãŒã§ã¯ã .vscodeãã£ã¬ã¯ããªã«settings.jsonãã¡ã€ã«ããããïŒçŸåšã®ãããžã§ã¯ãã®ïŒ ã¯ãŒã¯ã¹ããŒã¹èšå®ãããã«ä¿åãããŸãã
éããŠããtest.pyãã¡ã€ã«ã«æ»ãã[ ã³ãŒãã®å®è¡ ]ã³ã³ããã¹ãã¡ãã¥ãŒããã³ãã³ããå®è¡ããŸãã
![](https://habrastorage.org/webt/a5/bd/hs/a5bdhsm_hvqfn6y0fhcrgqns0ao.png)
çµ±åã¿ãŒããã«ã®åºåã«ã¯ããªã¢ãŒããã·ã³ïŒã³ã³ããïŒã§ã³ãŒããå®è¡ãããããšã確èªã§ããæ å ±ã衚瀺ãããŸãã ã³ã³ããã§ãããžã§ã¯ããå®è¡ããå¿ èŠããããšãã¯ãã€ã§ããWORKSPACE_SETTINGSã§èšå®ãè¡ãããåãããžã§ã¯ãã®.vscode / settings.jsonãã¡ã€ã«ãäœæããŠãããèšå®ã®ãã¹ãå°ã調æŽããŸãã
VSã³ãŒãã§ã®ãªã¢ãŒããããã°
test.pyãã¡ã€ã«ã®è¡ã®ã³ã¡ã³ãã解é€ããŠããã®ãã¡ã€ã«ãä¿åããŸãã
#### BEGIN. Visual Studio remote debugging server for Python import ptvsd print('Waiting connection on port 3000') ptvsd.enable_attach('my_secret', address=('0.0.0.0', 3000)) ptvsd.wait_for_attach() ptvsd.break_into_debugger() #### END. Visual Studio remote debugging server for Python
ãªã¢ãŒããããã°ãå¿ èŠãªå Žåã¯ããããã®ã³ãŒãè¡ããå®è¡ã®ããã«èµ·åããããã¡ã€ã«ã«æ¿å ¥ããå¿ èŠããããŸãã ã³ã³ããåŽã®ptvsdã¢ãžã¥ãŒã«ã¯ããŒã3000ãéããå€éšãããã¬ãŒãæ¥ç¶ããããšãæ³å®ããŠããŸãã å¿ èŠã«å¿ããŠãç¬èªã®æ¹æ³ã§ptvsdãæ§æã§ããŸãã
[ã³ãŒãã®å®è¡]ã³ã³ããã¹ãã¡ãã¥ãŒãåŒã³åºããŠã³ãŒããå®è¡ããŸãã çµ±å端æ«ã§ã¯ãã¹ã¯ãªãããããŒã3000ã§ã®æ¥ç¶ãåŸ æ©ããŠãããšããã¡ãã»ãŒãžã衚瀺ãããŸãããããã¬ãŒã«ç§»åããŠããã®ãããžã§ã¯ãã®æ°ããæ§æãäœæããŸãã
![](https://habrastorage.org/webt/pm/bk/8w/pmbk8worfhdq1weej-njtcruiq0.png)
launch.jsonãã¡ã€ã«ãç·šéçšã«éããæ¢ã«ããªã»ããããããŸãã 次ã®ã³ãŒããããã¯ã貌ãä»ããŸãã
{ "name": "Python LXC", "type": "python", "request": "attach", "localRoot": "${workspaceRoot}", "remoteRoot": "/mnt/hostfs/pytest", "host": "pytest", "port": 3000, "secret": "my_secret" }
ä¿åãããšã setting.jsonãã¡ã€ã«ã®æšªã®.vscode / launch.jsonãã£ã¬ã¯ããªã«è¡šç€ºãããŸãã 次ã«ãå·ŠåŽã®[ Python LXC]ããããããŠã³ãªã¹ããéžæããŸããããã¯å ã»ã©äœæãããããã¬ãŒæ§æã§ãã
![](https://habrastorage.org/webt/mf/0w/sm/mf0wsmby1i_c1thhc9s1gouskba.png)
[ãããã°ã®éå§]ãã¯ãªãã¯ããŸãã ãã¡ã€ã«test.pyã®ãããŠã£ã³ããŠã«ãåäœäžã®ãããã¬ãŒãšãã³ãŒãããªã¢ãŒãã§éå§ãããããšã®ç¢ºèªã衚瀺ãããŸãã
![](https://habrastorage.org/webt/nq/jl/5x/nqjl5xk37gigjbn8qfqh9yacos8.png)
ããã ãã§ã ã»ããã¢ãããå®äºããŸããã æ°ããpythonãããžã§ã¯ãã«å°æ¥å¿ èŠãªã®ã¯ã2ã€ã®.vscode / settings.jsonããã³.vscode / launche.jsonæ§æãã¡ã€ã«ãæ§æããããšã§ã ã ãããã¯ã«ã€ããŠè³ªåãããå Žåã¯ãã³ã¡ã³ãã§ãå°ããã ããã ããªãã®æ³šæãæåãããããžã§ã¯ãã«æè¬ââããŸãïŒ
11/10/2017 21:35 MSKããã®UPDã
ã³ã¡ã³ãã§ã¯ããŠãŒã¶ãŒSirEdvinã¯ãã³ã³ããã«ã®ã¿ã€ã³ã¹ããŒã«ãããŠããpythonã¢ãžã¥ãŒã«ã®ãšãã£ã¿ãŒã§ã®èªåè£å®ïŒãŸãã¯Microsoftã®çšèªã§ã¯IntelliSenseïŒã®å¯èœæ§ã«ã€ããŠå°ããŸãããã€ãŸãããããã®ã¢ãžã¥ãŒã«ã¯VS Codeãå®è¡ãããŠããããŒã«ã«ãã·ã³äžã«ãããŸããã
ãã®ç¹ã¯èšäºã§ã¯èŠéããŠããã®ã§ãå°ããªç« ã§è£è¶³ããŸãã
å€éšPythonã©ã€ãã©ãªã®èªåè£å®ã»ããã¢ããïŒIntelliSenseïŒ
ããšãã°ããããžã§ã¯ãã§ã¯ãPythonã®ããã©ã«ãããã¯ã¹ã§æäŸãããŠããªãã¢ãžã¥ãŒã«ã䜿çšãããã®ã¢ãžã¥ãŒã«ãã³ã³ããã«ã®ã¿ã€ã³ã¹ããŒã«ããŸããã ãã¹ãã«ã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããã«ãšãã£ã¿ãŒã§VS Codeããç解ãããªãŒãã³ã³ããªãŒããããã³ãã衚瀺ããããã³ã³ãããŒã®ã¢ãžã¥ãŒã«ããååŸããæ¹æ³ã¯ïŒ
ãã®åé¡ã解決ããã«ã¯ã YOUR_path_to_project / .vscode / settings.jsonã§WORKSPACE_SETTINGSèšå®ãéã ã python.autoComplete.extraPathsãã©ã¡ãŒã¿ãŒãè¿œå ããPythonã¢ãžã¥ãŒã«ãå«ãã³ã³ãããŒãã£ã¬ã¯ããªã®ãªã¹ããããŒãšããŠæå®ããŸãã
ããšãã°ãã³ã³ããã¯/ var / lib / lxd / containers / pytest / rootfs /ã®ãã¹ããã¡ã€ã«ã·ã¹ãã ã§å©çšã§ããŸã ã ããã¯ã pytestã³ã³ããã®ã«ãŒããã¡ã€ã«ã·ã¹ãã ã§ãã Pythonãå€éšã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå Žæãããã£ãŠããã®ã§ããã®ãã¹ãç°¡åã«è¿œå ããŠãå€éšã©ã€ãã©ãªãžã®ãã«ãã¹ãååŸã§ããŸãã numpyãªã©ã®ã¢ãžã¥ãŒã«ã®å Žåããã«ãã¹ã¯/var/lib/lxd/containers/pytest/rootfs/usr/local/lib/python3.6/dist-packagesã«ãªããŸãã ãã®ããã«ããã®ãã¹ãpython.autoComplete.extraPathsèšå®ã«è¿œå ããŸãã
![](https://habrastorage.org/webt/8l/1-/vg/8l1-vgessrq_60g8j9mxmqm7dtg.png)
èšå®ãä¿åããŠããããžã§ã¯ãã«æ»ããŸãã numpyã¢ãžã¥ãŒã«ãã€ã³ããŒãããŠãCTRL +ã¹ããŒã¹ããŒã§èªåè£å®ãåŒã³åºããŠãã ããã ç»é¢ã®ããã«ã§ããã¯ãã§ãïŒ
![](https://habrastorage.org/webt/l9/gq/5f/l9gq5f1aj9rio1wutpkc-gboou4.png)
ããã«åäœããªãå Žåã¯ãèœèããªãã§ãã ãããVSCodeã¯çµæããã£ãã·ã¥ããããã«åäœããªãå ŽåããããŸãããšãã£ã¿ãŒãéããŠéããfrom ... importããŒã¯ãŒãã®åŸã«ââCTRL + SPACEããŒãæŒããŠã¿ãŠãã ããã
ããã ãã§ã:)