I'm beginning with bash and I'm executing a script :
$ ./readtext.sh ./InputFiles/applications.txt
Here is my readtext.sh code :
#!/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"
I want to print the string ("./InputFiles/applications.txt") in a python file, I used sys.argv[1]
but this line gives me -c. How can I get this string ? Thank you
It is easier for you to pass the parameter "$1" to the internal
command python3
.
If you don't want to do that, you can still get the external
command line parameter with the trick of /proc
, for example:
$ 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']
Note:
- the shebang line in
parent.sh
is important, or you should execute ./parent.sh
with bash
, else you will get no command line param in ps
or /proc/$PPID/cmdline
.
- For the reason of
[2:-1]
: ext.split('\0') = ['bash', './parent.sh', 'aaaa', 'bbbb', '']
, real parameter of ./parent.sh
begins at 2, ends at -1.
Update: Thanks to the command of @cdarke that "/proc
is not portable", I am not sure if this way of getting command line works more portable:
$ 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])
which still have the same output.
This is the python file that you can use in ur case
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