简体   繁体   中英

Passing arguments to an entry point python script using argparser

I am looking to pass a user entered arguments from the command line to an entry point for a python script. Thus far I have tried to used argparse to pass the arguments from the command line to the test.py script. When I try to pass the arguments they are not recognised and I recieve the following error.

load_entry_point('thesaurus==0.1', 'console_scripts', 'thesaurus')()
TypeError: find_synonym() missing 1 required positional argument: 'argv'

I have looked at other examples on here but have not been able to get any of the solutions to work.

def main(argv):
    if argv is None:
        argv = sys.argv

    parser = argparse.ArgumentParser(description='Enter string')
    parser.add_argument('string', type=str, help='Enter word or words', nargs='*')
    args = parser.parse_args(argv[1:])
    print(args)

if __name__ == "__main__":
    sys.exit(main(sys.argv))

My setup.py script entry point looks like the following

setup(entry_points={'console_scripts': ['test=test_folder.main:main']})

What I expect to happen is similar to when I run python main.py main foo. Which will successfully print out hello when it is passes to the function.

So it works now when I remove the the arguments from the function.

 def main():          
        parser = argparse.ArgumentParser(description='Enter string')
        parser.add_argument('string', type=str, help='Enter word or words', nargs='*')
        args = parser.parse_args()
        print(args.string)

if __name__ == "__main__":
    main()

I believe that it might work with the sys.arv used in the first example, as my actual problem was that when I re-downloaded this script from GitHub using.

pip install git+ URL

The script was not updating so the error persisted, This required deleting all the files related to the GitHub repository and re-installing it using the same pip command.

To get the best of both worlds, main() should accept argv (which makes it easier to test, as you observed ). However, you need a default to use it as an entrypoint so it can be invoked with no args. That would look like this:


def main(argv=sys.argv):
    parser = argparse.ArgumentParser(description='Enter string')
    parser.add_argument('string', type=str, help='Enter word or words', nargs='*')
    args = parser.parse_args(argv[1:])
    print(args)

Now it is testable and you can still use it as an entrypoint.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM