For some reason this code produces error:
import os
def main():
print(os.path.isfile('/bin/cat'))
import os
if __name__ == '__main__':
main()
Result:
Traceback (most recent call last):
File "test.py", line 10, in <module>
main()
File "test.py", line 5, in main
print(os.path.isfile('/bin/cat'))
UnboundLocalError: local variable 'os' referenced before assignment
Why it happens? Note that at beginning of both cases there is import os. Somehow additional import in the end of the body of a function affects whole scope of this function.
If you remove import inside the function, everything is fine (which is not surprising).
import os
def main():
print(os.path.isfile('/bin/cat'))
# import os
if __name__ == '__main__':
main()
Result:
True
About possible duplicates: There are some similar questions, but regarding global variables, not imports.
If you import os in the global scope, you're creating a global variable called os. If you import os in local scope, you're creating a local variable called os. And if you try and use a local variable in a function before it's created, you get that error. Same as if you were explicitly assigning a variable.
The same solutions apply, if you want the import inside the function to create a global variable, you can use the global keyword:
def main():
global os
print(os.path.isfile('/bin/cat'))
import os
Or you could change your local import to use a different variable name so that your use of os is unambiguous.
def main():
print(os.path.isfile('/bin/cat'))
import os as _os
Though obviously this is just an example for demonstration, and there's no reason in this case to reimport os inside your function when you've already imported it globally.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With