Die*_*ego 5 python shell terminal subprocess python-3.x
比方说,我有一个 Shell 脚本,run.sh
它从键盘读取用户输入,然后执行一些特定任务。出于某些技术原因,我将此脚本迁移到 Python,例如run.py
,以实现完全相同的目标。
在文件中run.sh
,我要求用户输入一个输入,该输入通常是文件系统中的一个文件,因此我给出了“制表符完成”它的选项,并且我只需通过以下行即可实现它:
read -e -p "Choose a file: " file
该-e
标志完成制表符完成用户输入的工作。例如,如果用户的当前目录是project
,则其结构如下:
project
-- src
-- shared
-- lib
-- imgs
-- image.png
-- include
-- README.txt
Run Code Online (Sandbox Code Playgroud)
输入文件是image.png
他们可以按如下方式进行:
sh<tab>i<tab><tab>
结果是shared/imgs/image.png
.
现在我如何在 Python 脚本中实现它?您可能认为有大量相关问题,但我无法在 中重现完全相同的结果run.py
。
到目前为止我已经尝试过:
1.Python的os
模块:
project
-- src
-- shared
-- lib
-- imgs
-- image.png
-- include
-- README.txt
Run Code Online (Sandbox Code Playgroud)
输出:sh: 1: read: Illegal option -e
2.Python的subprocess
模块
import os
os.system("read -e -p 'Choose a file:'")
Run Code Online (Sandbox Code Playgroud)
输出:
Traceback (most recent call last):
File "run.py", line 26, in <module>
subprocess.run(['read', '-e', '-p', 'Choose a file'])
File "/usr/lib/python3.7/subprocess.py", line 453, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.7/subprocess.py", line 756, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.7/subprocess.py", line 1499, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'read': 'read'
Run Code Online (Sandbox Code Playgroud)
3.Python的readline
模块
import subprocess
subprocess.run(['read', '-e', '-p', 'Choose a file'])
Run Code Online (Sandbox Code Playgroud)
这看起来几乎可以工作,但有一个大问题:它只完成用户当前目录中的文件。如果用户点击s<tab>
然后src
并shared
显示,但如果他们点击sh<tab>
和lib
目录imgs
则不会显示。
我想要一些优雅而简单的方法来实现这一目标,但我相信这可能比预期的要困难一些。还有其他方法可以解决这个问题吗?
设置合理的完成分隔符:
import readline
readline.set_completer_delims(' \t\n=')
readline.parse_and_bind("tab: complete")
option = input("Tab complete a file: ")
Run Code Online (Sandbox Code Playgroud)
默认情况下,readline
将根据以下任一条件进行分隔:
>>> import readline
>>> readline.get_completer_delims()
' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>/?'
Run Code Online (Sandbox Code Playgroud)
由于/
是该集合的一部分,因此 a 之后的任何内容都/
将独立于它之前的任何内容完成。当您尝试完成文件路径时,这显然没有意义。
归档时间: |
|
查看次数: |
2374 次 |
最近记录: |