可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a Python program I\'m building that can be run in either of 2 ways: the first is to call \"python main.py\" which prompts the user for input in a friendly manner and then runs the user input through the program. The other way is to call \"python batch.py -file-\" which will pass over all the friendly input gathering and run an entire file\'s worth of input through the program in a single go.
The problem is that when I run \"batch.py\" it imports some variables/methods/etc from \"main.py\", and when it runs this code:
import main
at the first line of the program, it immediately errors because it tries to run the code in \"main.py\".
How can I stop Python from running the code contained in the \"main\" module which I\'m importing?
回答1:
Because this is just how Python works - keywords such as class
and def
are not declarations. Instead, they are real live statements which are executed. If they were not executed your module would be .. empty :-)
Anyway, the idiomatic approach is:
# stuff to run always here such as class/def
def main():
pass
if __name__ == \"__main__\":
# stuff only to run when not called via \'import\' here
main()
See What is if __name__ == \"__main__\"
for?
It does require source control over the module being import
ed, however.
Happy coding.
回答2:
Due to the way Python works, it is necessary for it to run your modules when it imports them.
To prevent code in the module from being executed when imported, but only when run directly, you can guard it with this if
:
if __name__ == \"__main__\":
# this won\'t be run when imported
You may want to put this code in a main()
method, so that you can either execute the file directly, or import the module and call the main()
. For example, assume this is in the file foo.py
.
def main():
print \"Hello World\"
if __name__ == \"__main__\":
main()
This program can be run either by going python foo.py
, or from another Python script:
import foo
...
foo.main()
回答3:
Use the if __name__ == \'__main__\'
idiom -- __name__
is a special variable whose value is \'__main__\'
if the module is being run as a script, and the module name if it\'s imported. So you\'d do something like
# imports
# class/function definitions
if __name__ == \'__main__\':
# code here will only run when you invoke \'python main.py\'
回答4:
Unfortunately, you don\'t. That is part of how the import syntax works and it is important that it does so -- remember def
is actually something executed, if Python did not execute the import, you\'d be, well, stuck without functions.
Since you probably have access to the file, though, you might be able to look and see what causes the error. It might be possible to modify your environment to prevent the error from happening.
回答5:
put the code inside a function and it won\'t run until you call the function. You should have a main function in your main.py. with the statement:
if __name__ == \'__main__\': main()
then, if you call \"python main.py\" the main() function will run. If you import main.py, it will not. Also, you should probably rename main.py to something else for clarity sake.
回答6:
You may write your \"main.py\" like this:
#!/usr/bin/env python
__all__=[\"somevar\", \"do_something\"]
somevar=\"\"
def do_something():
pass #blahblah
if __name__==\"__main__\":
do_something()
回答7:
There was a Python enhancement proposal PEP 299 which aimed to replace if __name__ == \'__main__\':
idiom with def __main__:
, but it was rejected. It\'s still a good read to know what to keep in mind when using if __name__ = \'__main__\':
.
回答8:
Although you cannot use import
without running the code; there is quite a swift way in which you can input your variables; by using numpy.savez
, which stores variables as numpy arrays in a .npz file. Afterwards you can load the variables using numpy.load
.
See a full description in the scipy documentation
Please note this is only the case for variables and arrays of variable, and not for methods, etc.
回答9:
Try just importing the functions needed from main.py? So,
from main import SomeFunction
It could be that you\'ve named a function in batch.py the same as one in main.py, and when you import main.py the program runs the main.py function instead of the batch.py function; doing the above should fix that. I hope.