That is right however if you use the -i option: -i run the file in IPython’s namespace instead of an empty one. This is useful if you are experimenting with code written in a text editor which depends on variables defined interactively. And you get:
In [1]: bar = 0 In [2]: foo = 0 In [3]: %run -i /tmp/test.py /tmp /tmp/test.py 0 In [4]: __file__ Out[4]: '/tmp/test.py' Bye, Dietrich Il giorno venerdì 14 ottobre 2016 10:25:04 UTC+2, Almar Klein ha scritto: > > Actually, it seems that IPython’s run magic runs the file in its own > namespace, where __file__ is defined. And afterwards, the current/main > namespace is updated with the variables created by running the file. > However, the current directory is not changed. > > > > === test.py === > > import os > > print(os.getcwd()) > > print(__file__) > > try: > > print(foo) > > except NameError: > > print('cannot reach foo') > > bar = 3 > > > > === IPython --- > > In [1]: cd > > C:\Users\almar > > > > In [2]: bar = 0 > > > > In [3]: foo = 0 > > > > In [4]: %run d:\dev\py\test.py > > C:\Users\almar > > d:\dev\py\test.py > > cannot reach foo > > > > In [5]: bar > > Out[5]: 3 > > > > In [6]: __file__ > > --------------------------------------------------------------------------- > > NameError Traceback (most recent call last) > > <ipython-input-6-adeb0343a89b> in <module>() > > ----> 1 __file__ > > > > NameError: name '__file__' is not defined > > > > ====== > > > > *From: *Dietrich Pescoller <javascript:> > *Sent: *11 October 2016 12:09 > *To: *Pyzo <javascript:> > *Cc: *dit...@gmail.com <javascript:>; proj...@gmail.com <javascript:> > *Subject: *Re: [Pyzo] IEP and __file__ > > > > Ok I see your point. I did the following further tests: > > I have the prova.py file containing print(__file__) > > and did the following with > > ~/anaconda3/bin/python > with open("/tmp/prova.py") as f: > code = compile(f.read(), "/tmp/prova.py", 'exec') > exec(code) > > > and got > > /tmp/prova.py in <module>() > ----> 1 print(__file__) > > NameError: name '__file__' is not defined > > > Than I did > > ~/anaconda3/bin/ipython > In [1]: %run /tmp/prova.py > /tmp/prova.py > > > So should pyzo be more "compatible/similar" to python or ipython? > > IMO since pyzo is more a Scientifice IDE, (ala Matlab) probably it should > be more "compatible/similar" to ipython than pure python. > Probably sometimes pragmaticity should be preferred to purity. > > But this is only my personal opinion, I fully understand your point and I > m not the person who can say which one is the better one. Probably this > should become a more > general discussion with more people involved. > > Anyway, probably the best is to let the things like they are, unless > other people or other arguments come up to support my way. > > Thanks, > Dietrich > > > > > > > > > Il giorno martedì 11 ottobre 2016 10:52:36 UTC+2, Almar Klein ha scritto: > > > wouldn't it be the best/easiest solution or simply set the __file__ > variable as the standard behavior? > > > > Well, if you’d first run a file as a script (which would set __file__), > and then run another file (not as a script) then the __file__ would be > overwritten, which would be wrong, IMO; __file__ should maintain the value > of the script that was initially run. > > > > > __file__ is only present when running a file as script. Similar to how > there is no __file__ in the normal Python interpreter > > > > I mean that there is no __file__ when you run the Python interpreter > interactively, without running a script. In your example you do run a > ascript. Try: > > > > $ python > > >> __file__ > > Traceback (most recent call last): > > File "<stdin>", line 1, in <module> > > NameError: name '__file__' is not defined > > > > > > > > *From: *Dietrich Pescoller > *Sent: *10 October 2016 14:36 > *To: *Pyzo > *Cc: *dit...@gmail.com; proj...@gmail.com > *Subject: *Re: [Pyzo] IEP and __file__ > > > > In your suggestion the only drawback is that 'foo.py' needs to be set > manually, This would work and is acceptable but of course not optimal. > > I can understand you point to not add another way to run a file. > My question/thought since in the current file execution (command) the > __file__ is not set and thus typically is not used, wouldn't it be the > best/easiest > solution or simply set the __file__ variable as the standard behavior? > > Btw you wrote in a prevoius mail: """__file__ is only present when running > a file as script. Similar to how > there is no __file__ in the normal Python interpreter. """ > > I'm not sure this is correct since I thing that the standard python > interpreter actually defines the __file__variable. > > I did worte prova.py with the following simple code: > print(__file__) > > and obtained both with ipython and python the same result: > > diti$ ~/anaconda3/bin/ipython /tmp/prova.py > /tmp/prova.py > diti$ ~/anaconda3/bin/python /tmp/prova.py > /tmp/prova.py > > Thanks, > Dietrich > > Il giorno lunedì 10 ottobre 2016 11:26:13 UTC+2, Almar Klein ha scritto: > > I am hesitant to add yet another way to run a file. Since the current > directory is changed now, would it work for you to put this at the top of > your file: > > > > __file__ = os.path.join(os.cwd(), ‘foo.py’) > > > > *From: *Dietrich Pescoller > *Sent: *10 October 2016 09:20 > *To: *Pyzo > *Cc: *dit...@gmail.com; proj...@gmail.com > *Subject: *Re: [Pyzo] IEP and __file__ > > > > Yes, but also in this case if I run the file as a script than the console > is retarted and we loose all previous work. > Effectively we are in a very same situation as we had with the current > directory setting. > > Perhaps could it be the definitive solution to have the option "running as > a script" not restarting the shell? If this is needed the user can do it > very easily manually, or perhaps having a third option, i.e. run as a > script (with all the special settings __file__ setting directory,) but not > automatically restarting. (just a thought) > > Finally I not really need to use __file__ I would just need to find out > another way to get the current filename. > > Thanks, > Dietrich > > Il giorno sabato 8 ottobre 2016 22:02:29 UTC+2, Almar Klein ha scritto: > > Run the file as a script. > > > > Running code normally (not as a script) is equivalent to firing up having > a Python interpreter and running code in it. There is no script file, and > thus no __file__. Technically, Pyzo could set __file__ each time a file is > run, but it would be wrong to reset that variable. > > > > I recently made a change to set the current directory when a file is run > also if its *not* run as a script. In this case practicality beats purity, > plus the current directory is expected to be more dynamic than the value of > __file__. > > > > - Almar > > > > > > > > *From: *Dietrich Pescoller > *Sent: *07 October 2016 16:41 > *To: *Pyzo > *Cc: *proj...@gmail.com > *Subject: *Re: [Pyzo] IEP and __file__ > > > > I had the same issue recently. > What would be the best way in a script to get its own filename than? > > Thanks, > Dietrich > > > > Il giorno martedì 13 ottobre 2015 22:32:24 UTC+2, Almar Klein ha scritto: > > __file__ is only present when running a file as script. Similar to how > there is no __file__ in the normal Python interpreter. > > - Almar > > On 13-10-15 22:08, Christophe Bal wrote: > > Hello. > > > > It seems that I can't use directly __file__. Is it normal or is it a bug > > ? If it's normal what is the technical reason for that ? > > > > > > *Christophe BAL* > > *Enseignant de mathématiques en Lycée **et développeur Python amateur* > > *---* > > *French math teacher in a "Lycée" **and **Python **amateur developer* > > > > -- > > You received this message because you are subscribed to the Google > > Groups "Pyzo" group. > > To unsubscribe from this group and stop receiving emails from it, send > > an email to pyzo+uns...@googlegroups.com > > <mailto:pyzo+uns...@googlegroups.com>. > > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "Pyzo" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to pyzo+uns...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > > > > -- > You received this message because you are subscribed to the Google Groups > "Pyzo" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to pyzo+uns...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > > > > -- > You received this message because you are subscribed to the Google Groups > "Pyzo" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to pyzo+uns...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > > > > -- > You received this message because you are subscribed to the Google Groups > "Pyzo" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to pyzo+uns...@googlegroups.com <javascript:>. > For more options, visit https://groups.google.com/d/optout. > > > -- You received this message because you are subscribed to the Google Groups "Pyzo" group. To unsubscribe from this group and stop receiving emails from it, send an email to pyzo+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.