如何制作Python脚本;“制表符完成”;终端中的目录?

如何制作Python脚本;“制表符完成”;终端中的目录?,python,python-3.x,shell,terminal,subprocess,Python,Python 3.x,Shell,Terminal,Subprocess,我有一个Shell脚本,比如说run.sh,它从键盘读取用户输入,然后执行一些特定任务。出于某些技术原因,我将此脚本迁移到Python,例如run.py,以实现完全相同的目标 在run.sh文件中,我向用户请求一个输入,这通常是文件系统中的一个文件,因此我给出了“tab completing”选项,并通过以下行实现: read-e-p“选择一个文件:”文件 -e标志完成选项卡完成用户输入的工作。例如,如果用户的当前目录为project,则其结构如下: project -- src -- shar

我有一个Shell脚本,比如说
run.sh
,它从键盘读取用户输入,然后执行一些特定任务。出于某些技术原因,我将此脚本迁移到Python,例如
run.py
,以实现完全相同的目标

run.sh
文件中,我向用户请求一个输入,这通常是文件系统中的一个文件,因此我给出了“tab completing”选项,并通过以下行实现:

read-e-p“选择一个文件:”文件

-e
标志完成选项卡完成用户输入的工作。例如,如果用户的当前目录为
project
,则其结构如下:

project
-- src
-- shared
   -- lib
   -- imgs
      -- image.png
-- include
-- README.txt
输入文件是
image.png
,它们可以按如下方式进行操作:

shi

结果将是
shared/imgs/image.png

现在我如何在Python脚本中实现它?您可能认为有很多相关问题,但我无法在
run.py
中重现完全相同的结果

到目前为止,我所尝试的:

1。Python的
os
模块:

导入操作系统
system(“read-e-p'选择文件:'”)
输出:
sh:1:读取:非法选项-e

2。Python的
子流程
模块

导入子流程
subprocess.run(['read'、'-e'、'-p'、'选择文件']))
输出:

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'
这一个看起来几乎可以工作,但有一个大问题:它只完成用户当前目录中的文件。如果用户点击
s
,则会显示
src
shared
,但如果用户点击
sh
则不会显示
lib
imgs
目录


我想要一些优雅而简单的方法来实现这一点,但我相信这可能比预期的要困难一些。还有其他方法可以解决这个问题吗

设置合理的完成分隔符:

import readline

readline.set_completer_delims(' \t\n=')
readline.parse_and_bind("tab: complete")
option = input("Tab complete a file: ")
默认情况下,
readline
将基于以下任何一项进行定界:

>>> import readline
>>> readline.get_completer_delims()
' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>/?'
导入readline >>>readline.get_completer_delims() “\t\n`~!@$%^&*()-=+[{]}\\|;:\'",/?'
由于
/
是此集合的一部分,因此
/
之后的任何内容都将独立于之前的任何内容完成。当您尝试完成文件路径时,这显然毫无意义。

尝试1和2失败的原因是
读取
是一个shell内置命令,而不是磁盘上的实际可执行文件。(它必须是内置的,因为它不能用它的结果设置shell变量。)谢谢,这正是我要找的。要访问带有空格的文件,我设置了
readline.set\u completer\u delims('\t\n=')