On Mon, Nov 7, 2016 at 1:11 AM, ddbug <pavel.aron...@gmail.com> wrote: > > In Windows, the user-local directory for scripts is %APPDATA%\Python\Scripts. > It is not in > PATH by default and finding it is hard (because Microsoft made it hidden in > their infinite > wisdom).
POSIX "~/.local" is hidden as well, by convention, so I don't see how the directory's being hidden is relevant. In Windows 10, showing hidden files and folders in Explorer takes just two clicks -- three if the ribbon is collapsed. It's not much harder in Windows 7, but you have to know how to set folder options. Or enter %appdata% in the location bar, or shell:appdata: http://www.winhelponline.com/blog/shell-commands-to-access-the-special-folders In cmd use "dir /a" to list all files or "dir /ad" to list all directories. You can use set "DIRCMD=/a" if you prefer to always list all files. (FYI, /a doesn't mean [a]ll; it's an [a]ttribute filter; an empty filter yields all files and directories.) In PowerShell it's "gci -fo" or "gci -fo -ad". To be verbose, the latter is "Get-ChildItem -Force -Attributes Directory". I do think using %APPDATA% is a mistake, but not because it's hidden. A --user install should be using %LOCALAPPDATA%, which is excluded from the user's roaming profile. It was also a mistake to dump everything into a common "Scripts" directory, since the Python version number isn't appended to script names. This was fixed in 3.5, which instead uses "%APPDATA%\Python\Python35\Scripts". > 1. would it be good if python interpreter could JUST find user-local scripts > - by default or by some > easy configuration option? That would be surprising behavior if it were enabled by default. It was already suggested that you add the user scripts directory to PATH and run the .py file directly. However, calling ShellExecuteEx to run a file by association isn't always an option. That's why pip and setuptools create EXE wrappers for script entry points when installing source and wheel distributions. Consider packaging your scripts in a wheel that defines entry points. For example: spam_scripts\spam.py: import sys def main(): print('spam%d%d' % sys.version_info[:2]) return 42 # unused classic entry point if __name__ == '__main__': sys.exit(main()) setup.py: from setuptools import setup setup(name='spam_scripts', version='1.0', description='...', url='...', author='...', author_email='...', license='...', packages=['spam_scripts'], entry_points = { 'console_scripts': ['spam=spam_scripts.spam:main'], }) build: > python setup.py bdist_wheel --universal > cd dist installation (3.5.2 on this system): > pip install --user spam_scripts-1.0-py2.py3-none-any.whl installation (latest 2.x): > py -2 -m pip install --user spam_scripts-1.0-py2.py3-none-any.whl Usage: >%APPDATA%\Python\Python35\Scripts\spam.exe spam35 >echo %errorlevel% 42 >%APPDATA%\Python\Scripts\spam.exe spam27 >echo %errorlevel% 42 -- https://mail.python.org/mailman/listinfo/python-list