提问人:C. Nielsen 提问时间:10/7/2023 最后编辑:General GrievanceC. Nielsen 更新时间:10/10/2023 访问量:102
运行一个 python 文件,该文件在批处理文件的文件名中使用 Unicode 字符
Run a python file which uses a Unicode character in the filename from a batch file
问:
我正在尝试运行的非常简单的 bat 文件,它本质上改变了目录/环境,然后使用 streamlit 运行程序,但我终生无法让它识别正在使用的 unicode 字符。这是 .bat 文件
@echo off
chcp 65001
call "C:\...\Miniconda3\Scripts\activate.bat"
call conda activate env
cd C:\...\Documents\GitHub\...
streamlit run 🌎_Project.py
pause
直到最近我才遇到问题,但无论我运行这个蝙蝠文件(或在 anaconda 提示符中逐行运行)时,我都会收到错误,其中 unicode 在 globe unicode 字符上读取不正确。
Error: Invalid value: File does not exist: ??_Project.py
我无法更改文件的名称,因为它位于更大的存储库中。我尝试以多种不同的格式保存蝙蝠文件(我认为UTF-8应该是正确的),并且我尝试调整字体以查看是否有奇怪的地方,但没有任何运气。除了手动重命名文件以及它出现在我本地的任何地方之外,还有什么解决方法吗?
答:
您面临的问题似乎与 CMD 对 Unicode 字符的有限支持有关。即使在更改用于启用 UTF-8 编码的代码页后,CMD 也可能不完全支持 Unicode 字符,例如文件名中的地球表情符号“🌎”。话虽如此,找到最佳解决方案确实取决于您的需求。chcp 65001
在我的情况下,该命令似乎按预期运行。这可能归因于我使用的是 Windows 10,这是一个更新的操作系统,尽管我不能肯定地说。有时,使用引号是必要的,但除此之外,它运行起来没有问题,这可能表明您正在使用不正确的原始编码保存文件。尽管如此,下面我提出了一些解决方案。
使用短文件名(8.3 文件名)
如果要将代码保持纯批处理状态,则此解决方案是最佳选择。
- 导航到 Python 脚本所在的目录 命令提示符。
- 运行以查看简短的 8.3 文件名和常规文件名
文件名。
dir /x
- 标识 _Project.py 的🌎短文件名。
- 在 .bat 脚本中使用短文件名,而不是 🌎 _Project.py。
例如,如果短文件名是 GLOBE~1.PY,则像这样修改 .bat 脚本:
@echo off
chcp 65001
call "C:\...\Miniconda3\Scripts\activate.bat"
call conda activate env
cd C:\...\Documents\GitHub\...
streamlit run GLOBE~1.PY
pause
Windows 具有此功能,它对您的目的非常有用。
使用 PowerShell
可以将整个批处理文件替换为 PowerShell 脚本,该脚本对 Unicode 和其他功能的支持要好得多,你以后可能需要添加这些功能。
创建包含以下内容的文件:.ps1
$env:Path += ";C:\...\Miniconda3\Scripts\"
conda activate env
Set-Location "C:\...\Documents\GitHub\..."
streamlit run "🌎_Project.py"
pause
若要运行 PowerShell 脚本,请右键单击它,然后选择“使用 PowerShell 运行”。
这样,您可以拥有更灵活的环境并保证其正常工作。
手动重命名(如果没有其他选项)
如果上述解决方案不合适,并且无法更改原始文件名,则可以将文件复制到具有 ASCII 名称的临时文件,运行它,然后将其删除。这不是最优雅的解决方案,但会起作用,如果情况是你不能运行但可以访问它。
@echo off
chcp 65001
call "C:\...\Miniconda3\Scripts\activate.bat"
call conda activate env
cd C:\...\Documents\GitHub\...
copy "🌎_Project.py" "temp_Project.py"
streamlit run temp_Project.py
del "temp_Project.py"
pause
希望对你有所帮助。
评论
streamlit
chcp 65001
streamlit
type 🌎_Project.py
The system cannot find the file specified.
FOR %%b IN ("🌎_Project.py") DO streamlit "%%b" …
也许?或者,如果您的系统生成了短文件名,则可以使用短文件名(dir /x “🌎_Project.py”)