首页 > 解决方案 > 为什么 python3.7 将 argv 元素与“垃圾”一起传递

问题描述

在我决定重写所有内容并使其可移植之前,我有这个脚本为我工作。无需过多研究细节,这里有一个中央 Bash 脚本,它在各自的文件夹中调用 5 个其他 Bash 脚本。我不打算很快移植到 Windows,目前这仅适用于 Linux。

中央 Bash 脚本的执行路径为:

dos.1/1-init.sh dos.1/

dos.2/1-trace-to-file.sh dos.2/ dos.1/

dos.3/1-recognize-categories.sh dos.3/

dos.4/1-ping-in-groups.sh dos.4/ dos.3/

dos.5/init.sh dos.5/ dos.4/

我跑./init.sh

在脚本“可移植”之前,我在每个脚本中使用了显式文件路径。一切都很好。该程序本身是 Bash 和 Python 的组合,并写入一个目录中的文件,以便可以以各种方式操作它们,然后再读回程序的不同部分。

我知道最快的方法是编写一个单一的 Python 脚本,使用 Bash 方面的子进程调用......但是,我这样做是为了简化维护,并且(在我开始制作它之前)便携式')它快如闪电。

我现在的问题是:每次我必须将文本读入 Python(从 SQL 或从文件)时,总是会添加垃圾。到目前为止,我一直在使用 sed、awk 和 Python 的.rstrip()函数来管理这个......这一切都很好,但是这个该死的函数不会玩得很好......而且我觉得必须有更好的方法。

在 bash 中,我将其称为:

$prog_dir=$1
$data_dir=$2
$prog_dir/2fast-ping.py $data_dir/group0.txt > $prog_dir/group0_averages.txt
$prog_dir/2fast-ping.py $data_dir/group1.txt > $prog_dir/group1_averages.txt
...

现在我知道我可以从 Python 中写入文件,但在这种情况下我有其他理由不这样做。

问题是,当 2fast-ping.py 脚本运行时,它会用逗号和换行符读取文本文件。我已经大力检查,我可以确认group#.txt文件 100% 不包含逗号。这是Python:

import sys
import subprocess
import select
from concurrent.futures import ThreadPoolExecutor

filename = sys.argv[1]

f = open(filename, "r")
ips = [elem.rstrip('\n') for elem in f]
print(ips)
f.close()

之后脚本继续对 IP 做一些工作,但这是痛苦的部分。如果我直接从 CLI: 调用脚本 ./2fast-ping.py ../dos.3/group0.txt,则会正确处理文本,并且取代指令实际上会起作用。但是,当从第一个 init 脚本调用时,程序基本上 sh*ts 本身,因为每一行都是用逗号读入的。它一直工作到它开始使用处理后的信息,然后:

<actual IP would be here>
ping: ('##.###.###.###',): Name or service not known

当然,问题是 ('',) 但是,Python 正在添加它,我不知道如何阻止它:(

有任何想法吗?

标签: pythonlinuxbashshellarguments

解决方案


Python 代码没问题,只需传递一个额外的 / 和参数 :(


推荐阅读