2017-12-19 13 views
0

ここでは円で丸く回っていて、おそらく非常に簡単な答えがあります。 私はthumbdriveでビデオファイルを回ってループし、.mp4という拡張子が見つかると、Youtubeのpythonの例を使ってyoutubeにアップロードします。これはコマンドラインから動作します。引数付きのbashからpythonスクリプトを呼び出す方法は?

私は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_up.py --file="$_file"作品、 が、追加の引数を追加は認められませんでしたが。

+0

をあなたの場合を'import sys'と' print str(sys.argv) 'を実行するpythonスクリプトを呼び出します。出力はどのように見えますか? – Ronald

+0

どこからyt_up.pyを取得しましたか? – quamrana

+0

'args =" - file = \ "$ {_ file} \" --title = \ "$ {_ file} \" --description = \ "show 2018 \" --keywords = \ " "2018、show、Winter、show 2018、\" --category = \ "28 \" --privacyStatus = \ "private \" "' - file = \ "$ {_ file} \" = '' --'の代わりに - - – mbieren

答えて

0

私は、pythonコマンドと同じ行に引数を追加するだけでよいと思います。この

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

ようです

+0

ありがとう、私はそれが私のタイプミスの蓄積だと思う - これは現在動作します。 – Nowski

+0

わかりました。とてもかっこいい – layekams

0

のpythonのためのあなたのargs変数が大きいsys.argv[1]で動作しますので、あなたはそれのために悩みを持っているかもしれません。このような

リライトシェル:

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はアレイであり、各それの素子分離sys.argv[i]要素としてPythonによって読み取られます。

+0

書き直してくれてありがとうございます。しかし、エラーがあるようです: ./batch2.sh:10:./batch2.sh:構文エラー: "("予期せぬ(期待している "fi") – Nowski

+0

@ノウズキは方法がありません今すぐ自分のコードをチェックしてくださいが、上で書いたgniourf_gniourfと同じです。コードを試してください。これは最善の解決策です(最長のbashスクリプト) –

2

現在のコードでは、反パターンや誤解がたくさんあります。

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 

ここで、グロブが何かにマッチしているかどうかを知りたいと思います。それは進行する方法ではありません。 Bashのshopt -s nullglobオプションを使用するか、if [ -e "$_file" ]; thenを使用して、グロブが実際のファイルと一致するかどうかを確認します。

  did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l) 
      if [ $did = 0 ]; then 

これは、ファイルに文字列が含まれていないかどうかを確認する方法です。代わりにif ! grep -q "$_file" /home/pi/Documents/uploaded_videos.txt; 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配列のためのものです!またここにいくつかの奇妙なハイフンがあることに注意してください。ここで

   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 

はあなたの過ちを修正する(そして、できればそれを動作させる)可能性です:

#!/bin/bash 

# We define a variable with the path to the uploaded_videos.txt file 
uploaded_videos=/home/pi/Documents/uploaded_videos.txt 

# Will expand non-matching globs to nothing: 
shopt -s nullglob 

# cd into the directory, and exit if fails 
cd /home/pi/Documents || exit 

# Use the builtin pwd instead of echo "$PWD" 
pwd 

for file in /media/pi/*/*.mp4; do 
    if ! grep -qFx "$file" "$uploaded_videos"; then 
     # Define an array to contain the arguments to pass 
     args=(
      --file="$file" 
      --title="$file" 
      --description="show 2018" 
      --keywords="2018,show, Winter,show 2018," 
      --category="28" 
      --privacyStatus="private" 
      ) 
     # call your script with the fields of the array as arguments 
     python yt_up.py "${args[@]}" 
     echo "$file uploaded to youtube via google developer api" | logger 
     echo "$file" >> "$uploaded_videos" 
    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 
関連する問題