关于another question,您如何考虑可能会发生变化的路径?例如,如果程序正在调用与程序位于同一目录中的文件,则只需在* nix中使用路径“。\ foo.py”即可。然而,显然Windows喜欢将路径硬编码,例如“C:\ Python_project \ foo.py”。
如果路径发生变化会怎样?例如,该文件可能不在C:驱动器上,而是在可以更改驱动器号的拇指驱动器或外部驱动器上。该文件可能仍与程序位于同一目录中,但与代码中的驱动器号不匹配。
我希望程序是跨平台的,但我希望我可能必须使用 os.name 或其他东西来确定要使用的路径代码块。
答案 0 :(得分:4)
简单回答:你根据环境计算绝对路径。
你真正需要的是一些指示。您可以从标准库中的不同位置收集各种运行时和环境信息(当我想在Windows上部署应用程序时,它们肯定会帮助我。)
所以,首先要做一些一般事情:
os.path
- 具有大量跨平台路径操作的标准库模块。你最好的朋友。 “关注os.path”我曾经读过一本书。__file__
- 当前模块的位置。sys.executable
- 正在运行的Python的位置。现在你可以从这三个来源收集你想要的任何东西。 os.path中的函数将帮助您绕过树:
os.path.join('path1', 'path2')
- 以跨平台方式加入路径段os.path.expanduser('a_path')
- 在用户的主目录中找到路径a_path
os.path.abspath('a_path')
- 将相对路径转换为绝对路径os.path.dirname('a_path')
- 获取路径所在的目录结合这个,例如:
# script1.py
# Get the path to the script2.py in the same directory
import os
this_script_path = os.path.abspath(__file__)
this_dir_path = os.path.dirname(this_script_path)
script2_path = os.path.join(this_dir_path, 'script2.py')
print script2_path
运行它:
ali@work:~/tmp$ python script1.py
/home/ali/tmp/script2.py
现在针对您的具体情况,您似乎在“工作目录”的概念与“脚本所在的目录”之间略有混淆。这些可以是相同的,但它们也可以是不同的。例如,可以更改“工作目录”,因此使用它的功能可能能够找到他们有时要查找的内容而不能查找其他内容。 subprocess.Popen
就是一个例子。
如果你总是绝对地传递路径,那么你将永远不会遇到工作目录问题。
答案 1 :(得分:0)
如果您的文件始终与您的程序位于同一目录中,那么:
def _isInProductionMode():
""" returns True when running the exe,
False when running from a script, ie development mode.
"""
return (hasattr(sys, "frozen") or # new py2exe
hasattr(sys, "importers") # old py2exe
or imp.is_frozen("__main__")) #tools/freeze
def _getAppDir():
""" returns the directory name of the script or the directory
name of the exe
"""
if _isInProductionMode():
return os.path.dirname(sys.executable)
return os.path.dirname(__file__)
应该有效。此外,我已经将py2exe用于我自己的应用程序,并且没有使用其他exe转换应用程序进行测试。
答案 2 :(得分:0)
什么 - 具体 - 你的意思是“调用文件...... foo.py”?
导入?如果是这样,该路径完全在您的程序之外。将PYTHONPATH
环境变量设置为.
或c:\
或shell级别的任何内容。例如,您可以编写2行shell脚本来设置环境变量并运行Python。
窗
SET PYTHONPATH=C:\path\to\library
python myapp.py
Linux的
export PYTHONPATH=./relative/path
python myapp.py
的execfile?考虑使用import。
阅读和评估?考虑使用import。
如果PYTHONPATH过于复杂,那么将您的模块放在Python lib / site-packages目录中,默认情况下将它放在PYTHONPATH上。
答案 3 :(得分:-1)
我使用 os.getcwd()计算出来。我还学习了如何使用 os.path.join 自动确定基于操作系统的正确路径格式。这是代码:
def openNewRecord(self, event): # wxGlade: CharSheet.<event_handler>
"""Create a new, blank record sheet."""
path = os.getcwd()
subprocess.Popen(os.path.join(path, "TW2K_char_rec_sheet.py"), shell=True).stdout
似乎工作正常。谢谢你的想法。