|
40 | 40 |
|
41 | 41 | import requests
|
42 | 42 |
|
43 |
| -from huggingface_hub import HfApi, SpaceHardware |
| 43 | +from huggingface_hub import HfApi, SpaceHardware, get_token |
44 | 44 | from huggingface_hub.utils import logging
|
45 | 45 | from huggingface_hub.utils._dotenv import load_dotenv
|
46 | 46 |
|
@@ -75,8 +75,16 @@ class RunCommand(BaseHuggingfaceCLICommand):
|
75 | 75 | def register_subcommand(parser: _SubParsersAction) -> None:
|
76 | 76 | run_parser = parser.add_parser("run", help="Run a Job")
|
77 | 77 | run_parser.add_argument("image", type=str, help="The Docker image to use.")
|
78 |
| - run_parser.add_argument("-e", "--env", action="append", help="Set environment variables.") |
79 |
| - run_parser.add_argument("-s", "--secrets", action="append", help="Set secret environment variables.") |
| 78 | + run_parser.add_argument("-e", "--env", action="append", help="Set environment variables. E.g. --env ENV=value") |
| 79 | + run_parser.add_argument( |
| 80 | + "-s", |
| 81 | + "--secrets", |
| 82 | + action="append", |
| 83 | + help=( |
| 84 | + "Set secret environment variables. E.g. --secrets SECRET=value " |
| 85 | + "or `--secrets HF_TOKEN` to pass your Hugging Face token." |
| 86 | + ), |
| 87 | + ) |
80 | 88 | run_parser.add_argument("--env-file", type=str, help="Read in a file of environment variables.")
|
81 | 89 | run_parser.add_argument("--secrets-file", type=str, help="Read in a file of secret environment variables.")
|
82 | 90 | run_parser.add_argument(
|
@@ -113,14 +121,15 @@ def __init__(self, args: Namespace) -> None:
|
113 | 121 | self.command: List[str] = args.command
|
114 | 122 | self.env: dict[str, Optional[str]] = {}
|
115 | 123 | if args.env_file:
|
116 |
| - self.env.update(load_dotenv(Path(args.env_file).read_text())) |
| 124 | + self.env.update(load_dotenv(Path(args.env_file).read_text(), environ=os.environ.copy())) |
117 | 125 | for env_value in args.env or []:
|
118 |
| - self.env.update(load_dotenv(env_value)) |
| 126 | + self.env.update(load_dotenv(env_value, environ=os.environ.copy())) |
119 | 127 | self.secrets: dict[str, Optional[str]] = {}
|
| 128 | + extended_environ = _get_extended_environ() |
120 | 129 | if args.secrets_file:
|
121 |
| - self.secrets.update(load_dotenv(Path(args.secrets_file).read_text())) |
| 130 | + self.secrets.update(load_dotenv(Path(args.secrets_file).read_text(), environ=extended_environ)) |
122 | 131 | for secret in args.secrets or []:
|
123 |
| - self.secrets.update(load_dotenv(secret)) |
| 132 | + self.secrets.update(load_dotenv(secret, environ=extended_environ)) |
124 | 133 | self.flavor: Optional[SpaceHardware] = args.flavor
|
125 | 134 | self.timeout: Optional[str] = args.timeout
|
126 | 135 | self.detach: bool = args.detach
|
@@ -449,7 +458,15 @@ def register_subcommand(parser):
|
449 | 458 | help=f"Flavor for the hardware, as in HF Spaces. Defaults to `cpu-basic`. Possible values: {', '.join(SUGGESTED_FLAVORS)}.",
|
450 | 459 | )
|
451 | 460 | run_parser.add_argument("-e", "--env", action="append", help="Environment variables")
|
452 |
| - run_parser.add_argument("-s", "--secrets", action="append", help="Secret environment variables") |
| 461 | + run_parser.add_argument( |
| 462 | + "-s", |
| 463 | + "--secrets", |
| 464 | + action="append", |
| 465 | + help=( |
| 466 | + "Set secret environment variables. E.g. --secrets SECRET=value " |
| 467 | + "or `--secrets HF_TOKEN` to pass your Hugging Face token." |
| 468 | + ), |
| 469 | + ) |
453 | 470 | run_parser.add_argument("--env-file", type=str, help="Read in a file of environment variables.")
|
454 | 471 | run_parser.add_argument(
|
455 | 472 | "--secrets-file",
|
@@ -480,14 +497,15 @@ def __init__(self, args: Namespace) -> None:
|
480 | 497 | self.image = args.image
|
481 | 498 | self.env: dict[str, Optional[str]] = {}
|
482 | 499 | if args.env_file:
|
483 |
| - self.env.update(load_dotenv(Path(args.env_file).read_text())) |
| 500 | + self.env.update(load_dotenv(Path(args.env_file).read_text(), environ=os.environ.copy())) |
484 | 501 | for env_value in args.env or []:
|
485 |
| - self.env.update(load_dotenv(env_value)) |
| 502 | + self.env.update(load_dotenv(env_value, environ=os.environ.copy())) |
486 | 503 | self.secrets: dict[str, Optional[str]] = {}
|
| 504 | + extended_environ = _get_extended_environ() |
487 | 505 | if args.secrets_file:
|
488 |
| - self.secrets.update(load_dotenv(Path(args.secrets_file).read_text())) |
| 506 | + self.secrets.update(load_dotenv(Path(args.secrets_file).read_text(), environ=extended_environ)) |
489 | 507 | for secret in args.secrets or []:
|
490 |
| - self.secrets.update(load_dotenv(secret)) |
| 508 | + self.secrets.update(load_dotenv(secret, environ=extended_environ)) |
491 | 509 | self.flavor: Optional[SpaceHardware] = args.flavor
|
492 | 510 | self.timeout: Optional[str] = args.timeout
|
493 | 511 | self.detach: bool = args.detach
|
@@ -523,3 +541,10 @@ def run(self) -> None:
|
523 | 541 | # Now let's stream the logs
|
524 | 542 | for log in api.fetch_job_logs(job_id=job.id):
|
525 | 543 | print(log)
|
| 544 | + |
| 545 | + |
| 546 | +def _get_extended_environ() -> Dict[str, str]: |
| 547 | + extended_environ = os.environ.copy() |
| 548 | + if (token := get_token()) is not None: |
| 549 | + extended_environ["HF_TOKEN"] = token |
| 550 | + return extended_environ |
0 commit comments