如何使用参数从bash调用python脚本?

如何使用参数从bash调用python脚本?,python,linux,bash,Python,Linux,Bash,我在这里转圈转圈,可能有一个非常简单的答案。 我有一个bash脚本,可以在thumbdrive中循环视频文件,如果它找到.mp4扩展名,它将使用youtube的python示例上传到youtube,该示例可以从命令行运行 在bash脚本中将参数传递给python脚本调用时遇到问题: cd /home/pi/Documents echo $PWD for _file in /media/pi/*/*.mp4; do clean=$(echo $_file|wc -m) if

我在这里转圈转圈,可能有一个非常简单的答案。 我有一个bash脚本,可以在thumbdrive中循环视频文件,如果它找到
.mp4
扩展名,它将使用youtube的python示例上传到youtube,该示例可以从命令行运行

在bash脚本中将参数传递给python脚本调用时遇到问题:

cd /home/pi/Documents
echo $PWD
for _file in  /media/pi/*/*.mp4; do
     clean=$(echo $_file|wc -m)
     if [ $clean -gt 15 ]; then
           did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l)
          if [ $did = 0 ]; then
               #Edit this to your liking
               #echo "now uploading $_file"
               args="--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\""
               python yt_up.py  "$args"
              echo $_file uploaded to youtube via google developer api | logger
               echo $_file >> /home/pi/Documents/uploaded_videos.txt
         fi
     fi
done
但是
yt_up.py
脚本无法识别这些参数。我尝试过各种引用的组合,但我就是无法让它发挥作用

我可以向脚本传递一个参数:

python yt\u up.py--file=“$\u file”
works,
但添加额外的参数并没有被识别。

我认为您只需在python命令的同一行中添加参数即可。像这样

python yt_up.py --file="${_file}" –-title="${_file}" --description="show 2018" --keywords="2018,show, Winter,show 2018," -–category="28" --privacyStatus="private"

它可以工作

我认为您只需在python命令的同一行中添加参数。像这样

python yt_up.py --file="${_file}" –-title="${_file}" --description="show 2018" --keywords="2018,show, Winter,show 2018," -–category="28" --privacyStatus="private"

python的
args
变量是一个很大的
sys.argv[1]
,因此您可能会因此遇到麻烦

像这样重写shell:

cd /home/pi/Documents
echo $PWD
for _file in  /media/pi/*/*.mp4; do
     clean=$(echo $_file|wc -m)
     if [ $clean -gt 15 ]; then
          did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l)
          if [ $did = 0 ]; then
               #Edit this to your liking
               #echo "now uploading $_file"
               args=( $(echo "--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\"") )
               python yt_up.py  "${args[@]}"
               echo $_file uploaded to youtube via google developer api | logger
               echo $_file >> /home/pi/Documents/uploaded_videos.txt
          fi
     fi
done

现在,
args
是数组,python会将它的每个元素作为分隔的
sys.argv[i]
元素来读取。

python的
args
变量是一个很大的
sys.argv[1]
,因此您可能会因此而遇到麻烦

像这样重写shell:

cd /home/pi/Documents
echo $PWD
for _file in  /media/pi/*/*.mp4; do
     clean=$(echo $_file|wc -m)
     if [ $clean -gt 15 ]; then
          did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l)
          if [ $did = 0 ]; then
               #Edit this to your liking
               #echo "now uploading $_file"
               args=( $(echo "--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\"") )
               python yt_up.py  "${args[@]}"
               echo $_file uploaded to youtube via google developer api | logger
               echo $_file >> /home/pi/Documents/uploaded_videos.txt
          fi
     fi
done

现在,
args
是数组,python会将它的每个元素作为分隔的
sys.argv[i]
元素来读取。

当前代码中有很多反模式和误解

cd /home/pi/Documents
为了获得最佳实践,您应该测试这是否成功。目前可能不是问题,但这样做没有坏处

echo $PWD
这里缺少引号,但这不是致命的

for _file in  /media/pi/*/*.mp4; do
     clean=$(echo $_file|wc -m)
这不是计算字符串中字符数的方法。您应该使用
clean=${#_file}

     if [ $clean -gt 15 ]; then
               #Edit this to your liking
               #echo "now uploading $_file"
               args="--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\""
我猜你想知道地球仪是否匹配任何东西。这不是怎么进行的。您可以使用Bash的
shopt-s nullglob
选项,也可以使用
if[-e“$\u文件”];然后
检查glob是否与实际文件匹配

           did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l)
          if [ $did = 0 ]; then
这就是检查文件是否包含字符串的方法。使用
if!grep-q“$\u file”/home/pi/Documents/uploaded\u videos.txt;然后改为

     if [ $clean -gt 15 ]; then
               #Edit this to your liking
               #echo "now uploading $_file"
               args="--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\""
在这里,您对shell如何读取命令有误解。引号删除是在变量展开之前执行的,因此您的引号是错误的。通常,您希望使用数组!这就是Bash数组的用途!还要注意,这里有一些奇怪的连字符

               python yt_up.py  "$args"
              echo $_file uploaded to youtube via google developer api | logger
               echo $_file >> /home/pi/Documents/uploaded_videos.txt
         fi
     fi
done
这里有一个修复错误的可能性(并希望它能起作用):

您可以通过显式检查
yt_up.py
是否成功来改进最后一步:

if python yt_up.py "${args[@]}"; then
    echo "$file uploaded to youtube via google developer api" | logger
    echo "$file" >> "$uploaded_videos"
else
    echo "Something wrong happened!"
fi

在您当前的代码中有很多反模式和误解

cd /home/pi/Documents
为了获得最佳实践,您应该测试这是否成功。目前可能不是问题,但这样做没有坏处

echo $PWD
这里缺少引号,但这不是致命的

for _file in  /media/pi/*/*.mp4; do
     clean=$(echo $_file|wc -m)
这不是计算字符串中字符数的方法。您应该使用
clean=${#_file}

     if [ $clean -gt 15 ]; then
               #Edit this to your liking
               #echo "now uploading $_file"
               args="--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\""
我猜你想知道地球仪是否匹配任何东西。这不是怎么进行的。您可以使用Bash的
shopt-s nullglob
选项,也可以使用
if[-e“$\u文件”];然后
检查glob是否与实际文件匹配

           did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l)
          if [ $did = 0 ]; then
这就是检查文件是否包含字符串的方法。使用
if!grep-q“$\u file”/home/pi/Documents/uploaded\u videos.txt;然后改为

     if [ $clean -gt 15 ]; then
               #Edit this to your liking
               #echo "now uploading $_file"
               args="--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\""
在这里,您对shell如何读取命令有误解。引号删除是在变量展开之前执行的,因此您的引号是错误的。通常,您希望使用数组!这就是Bash数组的用途!还要注意,这里有一些奇怪的连字符

               python yt_up.py  "$args"
              echo $_file uploaded to youtube via google developer api | logger
               echo $_file >> /home/pi/Documents/uploaded_videos.txt
         fi
     fi
done
这里有一个修复错误的可能性(并希望它能起作用):

您可以通过显式检查
yt_up.py
是否成功来改进最后一步:

if python yt_up.py "${args[@]}"; then
    echo "$file uploaded to youtube via google developer api" | logger
    echo "$file" >> "$uploaded_videos"
else
    echo "Something wrong happened!"
fi

如果调用执行导入sys和打印str(sys.argv)的python脚本,那么输出是什么样子的?从哪里获得的
yt\u up.py
?您有一个输入错误:
args=“--file=\“${u file\}”–-title=\“${u file}”–-description=\“show 2018\”–关键字=\“2018、show、Winter、show、show 2018、\”–category=\”28 \“-privacyStatus=\“private\”
注意
--file=\“${u file}\”–-title=
如果调用执行
导入sys
打印str(sys.argv)
的python脚本,则会有一个
-
而不是
-
,输出是什么样子的?你从哪里得到的
yt\u up.py
?你有一个输入错误:
args=“--file=\”${{u file}\”–-title=\“${u file}\”–-description=\“show 2018\”–-keywords=\“2018,show,Winter,show 2018,\”–-category=“28\”–privacyStatus=\“private\”
注意
--file=“${file\”–-title=
有一个
–-
而不是
--
感谢您的重写,但是似乎有一个错误:./batch2.sh:10:./batch2.sh:语法错误:“(“意外(预期为“fi”)@Nowski现在无法检查我的代码,但正如我所看到的,它与上面所写的gniourf_gniourf相同。试试他的代码,这是最好的解决方案。(最长的bash脚本)感谢您的重写,但似乎有一个错误:./batch2.sh:10:./batch2.sh:语法错误:(“意外(预期为“fi”)@Nowski现在没有办法检查我的代码,但正如我所看到的,它和上面写的gniourf_gniourf一样。试试他的代码,这是最好的解决方案。(最长的bash脚本)谢谢,我认为这是我打字错误的积累--现在可以了。谢谢,我认为这是我打字错误的积累--现在可以了。