-
Notifications
You must be signed in to change notification settings - Fork 180
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix: User script import now respects script_dir
#1542
base: main
Are you sure you want to change the base?
Conversation
…le_location` if not found.
…from_file_location` if not found.
@microsoft-github-policy-service agree company="Microsoft" |
could you provide an example scenario where the current implementation doesn't work? It was a design decision that the |
See below
By "design" you mean this doc, right? Custom Script
This is the origin implementation def import_module_from_file(module_path: Union[Path, str], module_name: Optional[str] = None):
module_path = Path(module_path).resolve()
if not module_path.exists():
raise ValueError(f"{module_path} doesn't exist")
... It seems this implementation specifically requires module_path (aka user_script) either an absolute path or locates in For example, a project structured like
workflow.json {
"user_script": "file.py",
"script_dir": "my_modules",
} Executing below commands will cause
|
What's more, IMHO, I think maybe Do you think this makes any sense? @jambayk |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tezheng commenting on this file so we can have a thread.
Your proposal for allowing user_script paths relative to the directory containing the config json makes a lot of sense. It would help a lot with the portability of olive projects.
However, apart from user_scripts, we also have many other resources like data dirs, script dirs, etc that have the same issue. Workflows can also be run on remote systems such as docker and azureml, both of which require resolvable paths for mounting. Due to this, we originally decided on paths that are absolute or relative to current dir so that every resource is resolvable and independent of one another.
After a discussion with the team, we agree that allowing paths to be relative to the working directory (directory containing config json) should also be supported. I have created a work item for this, and we can discuss offline on teams with you about the priority of this feature. This would require a more involved update of the entire codebase so that all resources have the same behavior (+ not have user script be a special case) and don't break compatibility with remote systems.
FYI this is how we infer resource types. This would need to be updated to check for paths relative to the working dir. There are also other Path.resolve()
instances throughout the codebase that we would need to updated accordingly.
Prefer
find_spec
for user script imports; fallback tospec_from_file_location
if not found.Describe your changes
The original implementation of
import_module_from_file
incorrectlychecked for the existence of user scripts in the current working
directory (
cwd
), regardless of thescript_dir
argument provided inimport_user_module
.This PR corrects this behavior by implementing the following logic:
importlib.util.find_spec
.importlib.util.spec_from_file_location
iffind_spec
failsChecklist before requesting a review
lintrunner -a
(Optional) Issue link
#1540