matt
matt

Reputation: 97

Executing Python Script in Terminal When Outside of Script's Directory

I have a Python script that prompts for text input, searches an online Korean dictionary, and then downloads MP3 audio files for the words found. I use the script to help me make Anki flashcards with audio. The script is originally from this post on reddit.

I can execute the script from the terminal while in the directory that the script is stored in. However, when I am in a different directory and execute the script by calling its full path, the script appears to run but does not find any words or download any MP3s. I cannot figure out why the script fails to execute correctly when I call it from a different directory.

The script is stored in the downloads folder on my Mac /Users/matt/Downloads So, when I run the following commands, it works:

cd Downloads
python3 naver.py

However, when I run the following, the script executes, but doesn't download any MP3s:

python3 /Users/matt/Downloads/naver.py

The full Python script is here:

import urllib.request, json, codecs, math, time
 
def searchWords(koreanWords):
    url = ('https://ko.dict.naver.com/api3/koko/search?' + urllib.parse.urlencode({'query': koreanWords}) + '&range=word&page=1')
    response = urllib.request.urlopen(url)
    reader = codecs.getreader("utf-8")
    jsonInfo = json.load(reader(response))
    pageCount = jsonInfo["pagerInfo"]["totalPages"]
    searchData = jsonInfo["searchResultMap"]["searchResultListMap"]["WORD"]["items"]
 
    for pageCountInc in range(0, pageCount):
        if pageCountInc != 0:
            url = ('https://ko.dict.naver.com/api3/koko/search?' + urllib.parse.urlencode({'query': koreanWords}) + '&range=word&page=' + str(pageCountInc+1))
        response = urllib.request.urlopen(url)
        reader = codecs.getreader("utf-8")
        jsonInfo = json.load(reader(response))
        searchData = jsonInfo["searchResultMap"]["searchResultListMap"]["WORD"]["items"]
        for z in range (0, len(searchData)):
            if searchData[z]["handleEntry"] in unchangedWordList:
                if searchData[z]["searchPhoneticSymbolList"]:
                    if searchData[z]["searchPhoneticSymbolList"][0]["phoneticSymbolPath"] != "":
                        timesDownloaded[unchangedWordList.index(searchData[z]["handleEntry"])] += 1
                        mp3Link = searchData[z]["searchPhoneticSymbolList"][0]["phoneticSymbolPath"]
                        if mp3Link not in mp3Links:
                            mp3Links.append(mp3Link)
                            urllib.request.urlretrieve(mp3Link, searchData[z]["handleEntry"] + str(timesDownloaded[unchangedWordList.index(searchData[z]["handleEntry"])]) + ".mp3")
                            time.sleep(.3)
   
def parseWords(listOfWords):
    for x in range(0, math.floor(len(listOfWords)/10)):
        tempWords = []
        for y in range(0, 10):
            tempWords.append(listOfWords[x*10+y])
 
        print("Searching: " + str(x+1) + "/" + str(math.ceil(len(listOfWords)/10)))
        searchWords(tempWords)
 
    tempWords = []
    for y in range(math.floor(len(listOfWords)/10)*10+1, len(listOfWords)):
        tempWords.append(listOfWords[y])
    print("Searching: " + str((math.ceil(len(listOfWords)/10))) + "/" + str(math.ceil(len(listOfWords)/10)))
    searchWords(tempWords)
unfoundWords = []
unchangedWordList = []
timesDownloaded = []
mp3Links = []
wordInputs = unchangedWordList = input('Enter Words: ').split()
timesDownloaded = [0] * len(unchangedWordList)
 
parseWords(wordInputs)
 
for z in range(0, len(timesDownloaded)):
    if(timesDownloaded[z] == 0):
        unfoundWords.append(unchangedWordList[z])
 
if unfoundWords:
    print(",".join(str(x) for x in unfoundWords) + " could not be found.")
    print("Rerunning individual searches for unfound words.")
    print(unfoundWords)
    oldUnfoundWords = unfoundWords
    unfoundWords = []
    for x in range(0, len(oldUnfoundWords)):
        print("Searching: " + str(x+1) + "/" + str(len(oldUnfoundWords)))
        searchWords(oldUnfoundWords[x])
 
    for z in range(0, len(timesDownloaded)):
        if(timesDownloaded[z] == 0):
            unfoundWords.append(unchangedWordList[z])
 
    if unfoundWords:
        print(",".join(str(x) for x in unfoundWords) + " could not be found.")

Upvotes: 0

Views: 386

Answers (2)

frankr6591
frankr6591

Reputation: 1247

To answer question of how to save to a specific folder use pathlib to construct the path to MP3 folder.

import os
from pathlib import Path
# Create parent folder
mp3DIR = os.path.join(Path.home(),'Music')
basename = searchData[z]["handleEntry"] 
           + str(timesDownloaded[unchangedWordList.index(searchData[z]["handleEntry"])]) + ".mp3"
urllib.request.urlretrieve(mp3Link, os.path.join(mp3Dir, basename))

Upvotes: 1

TheCrimeMinister
TheCrimeMinister

Reputation: 46

The reason is the following: Your python file runs in your current directory. So, when you run this: python3 /Users/matt/Downloads/naver.py, it either runs and saves the mp3 files in the current directory, or it doesn't save anything at all if it doesn't have the permissions to.

Upvotes: 0

Related Questions