【问题标题】:Get a string in Shell/Python using sys.argv使用 sys.argv 在 Shell/Python 中获取字符串
【发布时间】:2019-02-08 16:30:00
【问题描述】:

我从 bash 开始,我正在执行一个脚本:

$ ./readtext.sh ./InputFiles/applications.txt 

这是我的 readtext.sh 代码:

#!/bin/bash
filename="$1"
counter=1
while IFS=: true; do
  line=''
  read -r line
  if [ -z "$line" ]; then
    break
  fi

  echo "$line"
  python3 ./download.py \
    -c ./credentials.json \
    --blobs \
    "$line"
done < "$filename"

我想在 python 文件中打印字符串(“./InputFiles/applications.txt”),我使用了sys.argv[1],但这一行给了我-c。我怎样才能得到这个字符串?谢谢

【问题讨论】:

  • 显示./InputFiles/applications.txt 中的内容的小sn-p?
  • 这是一个包含 AndroidStore 应用程序列表的文本文件(com.ddd、com....)
  • 为什么在调用./download.py 时不直接传递"$filename" 作为附加参数?请注意,Python 脚本也应该使用argparse 来简化参数处理。

标签: python bash shell sys


【解决方案1】:

将参数“$1”传递给internal 命令python3 更容易。

如果你不想这样做,你仍然可以通过/proc的trick获取external命令行参数,例如:

$ cat parent.sh 
#!/usr/bin/bash

python3 child.py
$ cat child.py
import os

ext = os.popen("cat /proc/" + str(os.getppid()) + "/cmdline").read()
print(ext.split('\0')[2:-1])
$ ./parent.sh aaaa bbbb
['aaaa', 'bbbb']

注意:

  1. parent.sh 中的 shebang 行很重要,或者你应该使用bash 执行./parent.sh,否则你将在ps 或/proc/$PPID/cmdline 中没有命令行参数。
  2. 由于[2:-1]:ext.split('\0') = ['bash', './parent.sh', 'aaaa', 'bbbb', '']的原因,./parent.sh的实参从2开始,以-1结束。

更新:感谢@cdarke的命令“/proc不可移植”,我不确定这种获取命令行的方式是否更便携:

$ cat child.py
import os

ext = os.popen("ps " + str(os.getppid()) + " | awk ' { out = \"\"; for(i = 6; i <= NF; i++) out = out$i\" \" } END { print out } ' ").read()
print(ext.split(" ")[1 : -1])

仍然有相同的输出。

【讨论】:

  • /proc 不可移植。这可以在 Linux 上运行,但在许多其他类似 UNIX 的系统上却无法运行。
  • @cdarke 知道/proc 不便携,这让我很惊讶。谢谢你。我在发布之前在我的 Manjaro Linux 上进行了测试,但是在看到您的评论后,我不知道它是否可以在例如 OS X 上运行。
  • /proc 在 OS Mac(或 X)上不存在,它在 SunOS 上存在,但与 Linux 上的格式不同,所以它也不能在那里工作。您需要做的就是添加警告“如果您使用的是 Linux:....”
  • 我计算出了tail。您确实想使用 subprocess.run 而不是 os.popen 但这可能是一个太大的变化,无法进行编辑。
  • @GenoChen:我会选择 PyPi 的 psutil 模块。这是可移植的,甚至可以在 Windows 上运行。它有一个函数get_process_cmdline()。
【解决方案2】:

这是你可以使用的python文件

import sys

file_name = sys.argv[1]

with open(file_name,"r") as f:
    data = f.read().split("\n")

print("\n".join(data))

How to use sys.argv

How to use join method inside my python code

【讨论】:

  • 被否决:原始问题已经说过“sys.argv[1]”不是他需要的。
  • @GenoChen 他说他如何显示字符串。所以我给他写代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多