如何给python脚本传参
1.sys.argv
sys模块是很常用的模块, 它封装了与python解释器相关的数据,例如sys.modules里面有已经加载了的所有模块信息,sys.path里面是PYTHONPATH的内容,而sys.argv则封装了传入的参数数据。
import sys
gpus = sys.argv[1]
batch_size = sys.argv[2]
print(gpus)
print(batch_size)
2.argparse
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--gpus", type=str, default="0")
parser.add_argument("--batch-size", type=int, default=32)
args = parser.parse_args()
print(args.gpus)
print(args.batch_size)
脚本运行命令python script.py -gpus=0,1,2 --batch-size=10
中的–batch-size会被自动解析成batch_size.
parser.add_argument 方法的type参数理论上可以是任何合法的类型, 但有些参数传入格式比较麻烦,例如list,所以一般使用bool, int, str, float这些基本类型就行了,更复杂的需求可以通过str传入,然后手动解析。
bool类型的解析比较特殊,传入任何值都会被解析成True,传入空值时才为False
制作脚本
接收两个参数,项目名必传,app名不传默认为web!
将自己项目布局习惯写入即可
import argparse
import os
parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str)
parser.add_argument('--app', type=str, default='web')
args = parser.parse_args()
name = args.name
app_name = args.app
os.mkdir(f'./{name}')
# 创建app
os.mkdir(f'./{name}/{app_name}')
os.mkdir(f'./{name}/{app_name}/templates')
os.mkdir(f'./{name}/{app_name}/static')
os.mkdir(f'./{name}/{app_name}/static/js')
os.mkdir(f'./{name}/{app_name}/static/css')
os.mkdir(f'./{name}/{app_name}/static/fonts')
# 创建manage.py
manage_content = f"""
from gevent import monkey;monkey.patch_all()
from {app_name} import create_app, db, models
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = create_app()
manager = Manager(app)
Migrate(app=app, db=db)
manager.add_command('db', MigrateCommand)
@manager.command
def runserver_gevent():
from gevent import pywsgi
server = pywsgi.WSGIServer(("127.0.0.1", 5000), app)
server.serve_forever()
if __name__ == '__main__':
manager.run()
"""
with open(f'./{name}/manage.py', 'w', encoding='utf-8') as f:
f.write(manage_content)
# 创建settings.py
settings_content = f"""
from redis import Redis
from datetime import timedelta
import os
import sys
class Config:
DEBUG = True
TESTING = False
SECRET_KEY = ''
SESSION_REFRESH_EACH_REQUEST = True
SESSION_TYPE = 'redis'
# sqlalchemy配置
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@ip:port/database?charset=utf8'
SQLALCHEMY_POOL_SIZE = 5
SQLALCHEMY_POOL_TIMEOUT = 30
SQLALCHEMY_POOL_RECYCLE = -1
SQLALCHEMY_MAX_OVERFLOW = 0
SQLALCHEMY_TRACK_MODIFICATIONS = True
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, BASE_DIR)
print(os.path.join(BASE_DIR, {app_name}))
sys.path.insert(1, os.path.join(BASE_DIR, {app_name}))
class ProductionConfig(Config):
DEBUG = False
# SESSION_REDIS = Redis(host=..., port=...)
# PERMANENT_SESSION_LIFETIME = timedelta(days=7)
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@ip:port/database?charset=utf8'
class DevelopmentConfig(Config):
# PERMANENT_SESSION_LIFETIME = timedelta(days=1)
# SESSION_REDIS = Redis(host='127.0.0.1', port=6379)
pass
class TestingConfig(Config):
TESTING = True
DEBUG = False
"""
with open(f'./{name}/settings.py', 'w', encoding='utf-8') as f:
f.write(settings_content)
# 创建app/__init__.py
app_content = f"""
from flask import Flask
from flask_session import Session
from {app_name}.ext import db
def create_app():
app = Flask(__name__)
app.config.from_object('settings.DevelopmentConfig')
Session(app)
db.init_app(app)
return app
"""
with open(f'./{name}/{app_name}/__init__.py', 'w', encoding='utf-8') as f:
f.write(app_content)
# 创建app/ext.py
ext_content = """
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
"""
with open(f'./{name}/{app_name}/ext.py', 'w', encoding='utf-8') as f:
f.write(ext_content)
# 创建app/views.py & app/models.py
with open(f'./{name}/{app_name}/views.py', 'w', encoding='utf-8') as f:
f.write('# writing your view here!')
with open(f'./{name}/{app_name}/models.py', 'w', encoding='utf-8') as f:
f.write('# writing your db class here!')
执行:python flask-admin.py --name django
恶搞一下!
生成目录结构如下: